网络编程(师从韩顺平)

续写前面没有提到的内容

自定义线程

在这里插入图片描述

JVM,JDK,JRE

Java 核心机制-Java 虚拟机 [JVM java virtual machine]

基本介绍

  1. JVM 是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指令,管理数据、内存、寄存器,包含在JDK 中.

  2. 对于不同的平台,有不同的虚拟机。

  3. Java 虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行” [说明]

在这里插入图片描述

JDK

  • JDK 的全称(Java Development Kit)

Java 开发工具包

JDK = JRE + java 的开发工具 [java, javac,javadoc,javap 等]

  • JDK 是提供给 Java 开发人员使用的,其中包含了 java 的开发工具,也包括了 JRE。所以安装了 JDK,就不用在单独安装 JRE 了。

JRE

  • JRE(Java Runtime Environment

Java 运行环境)

JRE = JVM + Java 的核心类库[类]

  • 包括 Java 虚拟机(JVM Java Virtual Machine)和 Java 程序所需的核心类库等,如果想要运行一个开发好的 Java 程序,计算机中只需要安装 JRE 即可。

JDK、JRE 和 JVM 的包含关系

  1. JDK = JRE + 开发工具集(例如 Javac,java 编译工具等)

  2. JRE = JVM + Java SE 标准类库(java 核心类库)

  3. 如果只想运行开发好的 .class 文件 只需要 JRE

Java 技术体系平台

在这里插入图片描述

网络的相关概念

网络通信

在这里插入图片描述

网络

在这里插入图片描述

Ip 地址

IP对于IPV4 4个字节(32位)表示,1个字节的范围是0~255

IPV6 使用128位表示地址 16个字节
在这里插入图片描述

ipv4 地址分类

加粗样式

域名

在这里插入图片描述

网络通信协议

在这里插入图片描述
在这里插入图片描述

TCP 和 UDP

在这里插入图片描述

InetAddress 类

相关方法

在这里插入图片描述

应用案例

编写代码,获取计算机的主机名和 IP 地址相关 API
在这里插入图片描述

package 网络编程;

import java.net.InetAddress;

/**
 * @Author: 韩如意
 * @CreateTime: 2025-03-10
 * @Description: no
 * @Version: 1.0
 */

public class demo01 {
    public static void main(String[] args) throws Exception {
        //1. 获取本机 InetAddress 对象 getLocalHost
        InetAddress localHost = InetAddress.getLocalHost();
        System.out.println(localHost);  //DESKTOP-71GCG5L/192.168.43.185

        //2. 根据指定主机名/域名获取 ip 地址对象 getByName
        InetAddress host2 = InetAddress.getByName("DESKTOP-71GCG5L");
        System.out.println(host2);  //DESKTOP-71GCG5L/192.168.43.185

        //3. 根据域名返回InetAddress对象
        InetAddress host3 = InetAddress.getByName("www.baidu.com");
        System.out.println(host3);  //www.baidu.com/153.3.238.28

        //4. 获取 InetAddress 对象的主机名 getHostName
        String host3Name = host3.getHostName();
        System.out.println(host3Name);  //www.baidu.com

        //5. 获取 InetAddress 对象的地址 getHostAddress
        String host3Address = host3.getHostAddress();
        System.out.println(host3Address);  //153.3.238.28

    }
}

Socket

基本介绍

在这里插入图片描述

示意图:

在这里插入图片描述

TCP 网络通信编程

基本介绍

在这里插入图片描述

应用案例 1(使用字节流)

缓冲流(带Buffer)的一定要调用flush才能把数据写进去
在这里插入图片描述

SocketTCP01Server.java 服务端

package 网络编程;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Author: 韩如意
 * @CreateTime: 2025-03-10
 * @Description: 服务端
 * @Version: 1.0
 */

public class SocketTCP01Server {
    public static void main(String[] args) throws IOException {
//思路
//1. 在本机 的 9999 端口监听, 等待连接
// 细节: 要求在本机没有其它服务在监听 9999
// 细节:这个 ServerSocket 可以通过 accept() 返回多个 Socket[多个客户端连接服务器的并发]
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务端,在 9999 端口监听,等待连接..");
//2. 当没有客户端连接 9999 端口时,程序会 阻塞, 等待连接
// 如果有客户端连接,则会返回 Socket 对象,程序继续
        Socket socket = serverSocket.accept();
        System.out.println("服务端 socket =" + socket.getClass());
//
//3. 通过 socket.getInputStream() 读取客户端写入到数据通道的数据, 显示
        InputStream inputStream = socket.getInputStream();
//4. IO 读取
        byte[] buf = new byte[1024];
        int readLen = 0;
        while ((readLen = inputStream.read(buf)) != -1) {
            System.out.println(new String(buf, 0, readLen));//根据读取到的实际长度,显示内容. }
        }
        //5.关闭流和 socket
            inputStream.close();
            socket.close();
            serverSocket.close();//关闭
    }
}

SocketTCP01Client.java    客户端
package 网络编程;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

/**
 * @Author: 韩如意
 * @CreateTime: 2025-03-10
 * @Description: 客户端,发送 "hello, server" 给服务端
 * @Version: 1.0
 */

public class SocketTCP01Client {
    public static void main(String[] args) throws IOException {
//思路
//1. 连接服务端 (ip , 端口)
//解读: 连接本机的 9999 端口, 如果连接成功,返回 Socket 对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("客户端 socket 返回=" + socket.getClass());
//2. 连接上后,生成 Socket, 通过 socket.getOutputStream()
// 得到 和 socket 对象关联的输出流对象
        OutputStream outputStream = socket.getOutputStream();
//3. 通过输出流,写入数据到 数据通道
        outputStream.write("hello, server".getBytes());
//4. 关闭流对象和 socket, 必须关闭
        outputStream.close();
        socket.close();
        System.out.println("客户端退出.....");
    }

}

应用案例 2(使用字节流)

注意:写入结束标记。socket.shutdownOutput(); 用于输出流的结束标记

writer.newLine() 也可以是一个结束标记,但是要求对方使用readLine()才算
在这里插入图片描述

服务端代码

package 网络编程.作业;

import com.sun.corba.se.spi.activation.Server;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Author: 韩如意
 * @CreateTime: 2025-03-10
 * @Description: 服务端
 * @Version: 1.0
 */

public class demo01 {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务端监听,等待连接");
        Socket socket = serverSocket.accept();
        System.out.println("socket 的运行类型"+ socket.getClass());
        InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello,server".getBytes());
        socket.shutdownOutput();
        byte[] buffer = new byte[1024];
        int len;
        while((len=inputStream.read(buffer) )!= -1) {
            System.out.println(new String(buffer,0,len));
        }

        inputStream.close();
        outputStream.close();
        socket.close();
        serverSocket.close();
        System.out.println("服务端退出");
    }
}

客户端代码

package 网络编程.作业;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * @Author: 韩如意
 * @CreateTime: 2025-03-10
 * @Description: 客户端
 * @Version: 1.0
 */

public class demo02 {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("连接上了"+socket.getClass());
        OutputStream outputStream = socket.getOutputStream();
        InputStream inputStream = socket.getInputStream();
        outputStream.write("hello,client".getBytes());
        socket.shutdownOutput();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len=inputStream.read(buffer))!=-1){
            System.out.println(new String(buffer,0,len));
        }
        inputStream.close();
        outputStream.close();
        socket.close();
        System.out.println("客户端退出!");
    }
}

应用案例 3(使用字符流)

在这里插入图片描述

客户端

package 网络编程.作业;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * @Author: 韩如意
 * @CreateTime: 2025-03-10
 * @Description: no
 * @Version: 1.0
 */

public class demo04Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("客户端连接上了。。。socket的运行类型是" + socket.getClass());
        InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello,server");
//        bufferedWriter.newLine();    这个也表示写入数据结束
        bufferedWriter.flush();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        socket.shutdownOutput();
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
        socket.close();
        bufferedWriter.close();
        bufferedReader.close();
    }
}

服务端

package 网络编程.作业;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Author: 韩如意
 * @CreateTime: 2025-03-10
 * @Description: no
 * @Version: 1.0
 */

public class demo03Sever {
    public static void main(String[] args) throws IOException {
        ServerSocket severSocket = new ServerSocket(9999);
        System.out.println("客户端监听,等待连接");
        Socket socket = severSocket.accept();
        System.out.println("socket的运行类型");
        InputStream inputStream = socket.getInputStream();
        socket.getOutputStream();
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        bufferedWriter.write("hello,client");
        bufferedWriter.flush();   //一定要刷新,否则内容写不进去,报错
        socket.shutdownOutput();
        String line = null;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
        bufferedReader.close();
        bufferedWriter.close();
        socket.close();
        severSocket.close();
    }
}

应用案例 4(传图片)

在这里插入图片描述

服务端

package 网络编程.作业;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Author: 韩如意
 * @CreateTime: 2025-03-10
 * @Description: no
 * @Version: 1.0
 */

public class demo05Sever {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("客户端开始监听了,等待连接。。。");
        Socket socket = serverSocket.accept();
        BufferedInputStream bufferedInputStream = new BufferedInputStream(socket.getInputStream());
        String path = "C:\\Users\\user\\Desktop\\Java\\File\\bom01.png";
        BufferedOutputStream bufferedOutputStream1 = new BufferedOutputStream(new FileOutputStream(path));
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len = bufferedInputStream.read(bytes)) != -1) {
            bufferedOutputStream1.write(bytes, 0, len);
        }
        bufferedOutputStream1.flush();


        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bufferedWriter.write("收到图片");
        bufferedWriter.flush();
        socket.shutdownOutput();

        bufferedWriter.close();
        bufferedInputStream.close();
       bufferedOutputStream1.close();
        socket.close();
        serverSocket.close();
    }
}

客户端

package 网络编程.作业;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * @Author: 韩如意
 * @CreateTime: 2025-03-10
 * @Description: no
 * @Version: 1.0
 */

public class demo06Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
        System.out.println(socket.getClass());
        String path = "C:\\Users\\user\\Desktop\\Java\\图片\\bom01.png";
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(path));

        byte[] buff = new byte[1024];
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());
        int len = 0;
        while (((len=bufferedInputStream.read(buff)))!=-1){
            bufferedOutputStream.write(buff,0,len);
        }
        bufferedOutputStream.flush();
        socket.shutdownOutput();

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line = null;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }


        bufferedReader.close();
        bufferedOutputStream.close();
        socket.close();
        bufferedInputStream.close();
    }
}

netstat 指令

在这里插入图片描述

TCP 网络通讯不为人知的秘密

在这里插入图片描述

UDP 网络通信编程

基本介绍

在这里插入图片描述

基本流程

在这里插入图片描述

应用案例

在这里插入图片描述

UDP接收端

package 网络编程.UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * @Author: 韩如意
 * @CreateTime: 2025-03-11
 * @Description: UDP接收端
 * @Version: 1.0
 */

public class UDPReceiverA {
    public static void main(String[] args) throws IOException {
//1. 创建一个 DatagramSocket 对象,准备在 9999 接收数据
        DatagramSocket socket = new DatagramSocket(9999);
//2. 构建一个 DatagramPacket 对象,准备接收数据
// 在前面讲解 UDP 协议时,老师说过一个数据包最大 64k
        byte[] buf = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
//3. 调用 接收方法, 将通过网络传输的 DatagramPacket 对象
// 填充到 packet 对象
//老师提示: 当有数据包发送到 本机的 9999 端口时,就会接收到数据
// 如果没有数据包发送到 本机的 9999 端口, 就会阻塞等待.
        System.out.println("接收端 A 等待接收数据..");
        socket.receive(packet);
//4. 可以把 packet 进行拆包,取出数据,并显示.
        int length = packet.getLength();//实际接收到的数据字节长度
        byte[] data = packet.getData();//接收到数据
        String s = new String(data, 0, length);
        System.out.println(s);
//===回复信息给 B 端
//将需要发送的数据,封装到 DatagramPacket 对象
        data = "好的, 明天见".getBytes();
//说明: 封装的 DatagramPacket 对象 data 内容字节数组 , data.length , 主机(IP) , 端口
        packet = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.248.1"), 9998);
        socket.send(packet);//发送
//5. 关闭资源
        socket.close();
        System.out.println("A 端退出...");
    }
}

发送端 B ====> 也可以接收数据

package 网络编程.UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * @Author: 韩如意
 * @CreateTime: 2025-03-11
 * @Description: 发送端 B ====> 也可以接收数据
 * @Version: 1.0
 */

public class UDPSenderB {
    public static void main(String[] args) throws IOException {
//1.创建 DatagramSocket 对象,准备在 9998 端口 接收数据
        DatagramSocket socket = new DatagramSocket(9998);
//2. 将需要发送的数据,封装到 DatagramPacket 对象
        byte[] data = "hello 明天吃火锅~".getBytes(); //
//说明: 封装的 DatagramPacket 对象 data 内容字节数组 , data.length , 主机(IP) , 端口
        DatagramPacket packet =
                new DatagramPacket(data, data.length, InetAddress.getByName("192.168.248.1"), 9999);
        socket.send(packet);
//3.=== 接收从 A 端回复的信息
//(1) 构建一个 DatagramPacket 对象,准备接收数据
// 在前面讲解 UDP 协议时,老师说过一个数据包最大 64k
        byte[] buf = new byte[1024];
        packet = new DatagramPacket(buf, buf.length);
//(2) 调用 接收方法, 将通过网络传输的 DatagramPacket 对象
// 填充到 packet 对象
//老师提示: 当有数据包发送到 本机的 9998 端口时,就会接收到数据
// 如果没有数据包发送到 本机的 9998 端口, 就会阻塞等待. s
        socket.receive(packet);
//(3) 可以把 packet 进行拆包,取出数据,并显示.
        int length = packet.getLength();//实际接收到的数据字节长度
        data = packet.getData();//接收到数据
        String s = new String(data, 0, length);
        System.out.println(s);
//关闭资源
        socket.close();
        System.out.println("B 端退出");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值