Java基础 Day26
一、网络编程简介
1、概念
网络编程指在网络通信协议下,不同计算机上运行的程序,进行数据传输
2、软件架构
(1)CS架构(客户端和服务端)
在用户本地有一个客户端程序,在远程有一个服务器端程序
(2)BS架构(浏览器和服务端)
只需要浏览器,用户通过不同的网址,客户访问不同的服务器端程序
微信小程序属于BS架构
二、网络编程三要素
1、IP
(1)简介
Internet Protocol,是互联网协议地址,也称IP地址
上网设备在网络中的地址,是唯一的
是设备在网络中的唯一标识
有 IPv4 和 IPv6
域名通过 DNS 服务器解析为 IP
(2)IPv4 的地址分类形式
公网地址(万维网使用) 和私有地址(局域网使用)
192.168. 开头的就是私有地址,范围即为192.168.0.0~192.168.255.255
专门为组织机构内部使用,以此节省IP
(3)特殊 IP 地址
127.0.0.1,也可以是localhost,是回送地址,也称本地回环地址,也称本机IP,永远只会寻找当前所在本机
(4)常用CMD命令
ipconfig:查看本机IP地址
ping:检查网络是否连通
(5)INetAddress 类
static InetAddress getByName(String host) | 确定主机名称的IP地址 主机名称可以是机器名称,也可以是IP地址 |
String getHostName() | 获取此 IP 地址的主机名 |
String getHostAddress() | 返回文本显示中的 IP 地址字符串 |
2、端口
应用程序在设备中唯一的标识
端口号:由两个字节表示的整数,取值范围:0~65535
其中0~1023之间的端口号用于一些知名的网络服务或者应用
我们自己使用1024及以上的端口号即可
注意:一个端口号只能被一个应用程序使用
3、协议
计算机网络中,连接和通信的规则被称为网络通信协议
常见的协议有UDP、TCP、http、https、ftp等
三、UDP 协议
1、特点
UDP是面向无连接通信协议(没有接收端也能发送)
速度快,有大小限制(一次最多发送64K),数据不安全,易丢失数据
2、收发数据步骤及示例
public class Send { public static void main(String[] args) throws Exception { // 1、创建DatagramSocket对象 DatagramSocket socket = new DatagramSocket(8888); // 如果不指定端口,则随机指定一个 // 2、创建DatagramPacket对象 String message = "Hello World!"; byte[] content = message.getBytes(); DatagramPacket packet = new DatagramPacket( content, content.length, InetAddress.getByName("127.0.0.1"), 9999 ); // 3、发送信息 socket.send(packet); // 4、释放资源 socket.close(); } } public class Receive { public static void main(String[] args) throws Exception { // 1、创建DatagramSocket对象 DatagramSocket socket = new DatagramSocket(9999); // 2、创建DatagramPacket对象 byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); // 3、接收数据 socket.receive(packet); // 注意:receive方法会阻塞,直到接收到信息后才会往下执行 // 接收到的数据在 packet中 // 4、解析数据 byte[] data = packet.getData(); String msg = new String(data, 0, packet.getLength()); String ip = packet.getAddress().getHostAddress(); System.out.println("from: " + ip); System.out.println("data: " + msg); // 5、释放资源 socket.close(); }
四、TCP 协议
1、特点
TCP 协议是面向连接的通信协议(需要服务端响应请求)
速度慢,但没有大小限制,数据安全
2、收发数据步骤及示例
public class Client { public static void main(String[] args) throws Exception { // 1、创建Socket对象,指定服务端的IP和端口 Socket socket = new Socket("127.0.0.1", 8888); // 2、获取传输数据的流对象 OutputStream os = socket.getOutputStream(); InputStream is = socket.getInputStream(); // 3、收发数据 os.write("Nice to meet you".getBytes()); byte[] data = new byte[1024]; int len = is.read(data); String msg = new String(data, 0, len); String ip = socket.getInetAddress().getHostAddress(); System.out.println("from: " + ip); System.out.println("data: " + msg); // 4、释放资源 socket.close(); } } public class Server { public static void main(String[] args) throws Exception { // 1、创建ServerSocket对象,指定端口 ServerSocket server = new ServerSocket(8888); System.out.println("waiting for client..."); // 2、相应客户端发送的请求 Socket socket = server.accept(); // 3、获取传输数据的流对象 OutputStream os = socket.getOutputStream(); InputStream is = socket.getInputStream(); // 4、收发数据 byte[] data = new byte[1024]; int len = is.read(data); String msg = new String(data, 0, len); String ip = socket.getInetAddress().getHostAddress(); System.out.println("from: " + ip); System.out.println("data: " + msg); os.write("Nice to meet you too".getBytes()); // 5、关流并释放资源 socket.close(); server.close(); } }
3、细节补充
(1)三次握手
第一次:客户端向服务器发送连接请求(SYN包)并等待服务器确认
第二次:服务器向客户端返回一个响应(SYN包 + ACK包)告诉客户端收到了请求
第三次:客户端向服务器再次发送确认信息(ACK包),连接建立
Tips:第三次握手是为了防⽌失效的连接请求突然传到服务器(如网络延迟的重复SYN包)造成单向连接
(4)四次挥手
第一次:客户端向服务器发送取消连接的请求(FIN包)
第二次:服务器返回一个响应(ACK包)告诉客户端收到了请求
服务器将最后的数据处理完毕
第三次:服务器向客户端发送确认取消连接的消息(FIN包)
第四次:客户端再次发送确认消息(ACK包),连接取消