109.netstat指令
-
netstat -an 可以查看当前主机网络情况,包括端口监听情况和网络连接情况
-
netstat -an|more 可以分页显示
-
要求在dos控制台下执行
说明:
-
LISTENING表示某个端口在监听
-
如果有一个外部程序(客户端)连接到该端口,就会显示一条连接信息
-
ctrl + c 退出指令
110.TCP连接秘密
1.当客户端连接到服务器后,实际上客户端也是通过一个端口的服务端进行通讯的,这个端口是TCP/IP来分配的,不确定的,随机的
2.示意图
3.程序验证
111.UDP网络通信编程
基本信息
-
类 DatagramSocket和 DatagramPacket[数据报/数据包] 实现了基于UDP 协议网络程序
-
UDP数据通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达
-
DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号
-
UDP协议中每隔数据报都给出了完整的地址信息,因此无需建立发送方和接收方的连接
基本流程
-
核心的两个类/对象 DatagramSocket与DatagramPacket
-
建立发送端,接收端(没有服务端和客户端概念)
-
发送数据前,建立数据包/报 DatagramPacket对象
-
调用DatagramSocket的发送,接收方法
-
关闭DatagramSocket
UDP说明:
-
没有明确的服务端和客户端,演变成数据的发送端和接收端
-
接收数据和发送数据是通过 DatagramSocket 对象完成
-
将数据封装到 DatagramPacket 对象/包装
-
当接收到 DatagramPacket 对象,需要进行拆包,取出数据
-
DatagramSocket 可以指定在哪个端口接收数据
应用案例:
//1.编写一个接收端A和一个发送端B //2.接收端A在9999端口等待接收数据(receive) //3.发送端A向接收端B 发送数据“hello,明天吃火锅~” //4.接收端B接收到发送端A发送的数据,回复“好的,明天见”再退出 //5.发送端接收回复的数据,再退出 ===============//ReceiverA//=============== public class UDPReceiverA { public static void main(String[] args) throws Exception { //1.创建一个DatagramSocket对象,准备在9999端口接收数据 DatagramSocket socket = new DatagramSocket(9999); //2.构造一个 DatagramPacket对象 // 一个数据包,最大是64k byte[] buf = new byte[64 * 1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); //3.调用 接受方法,将通过网络传输的 DatagramPacket对象填充到packet对象 // 当有数据包发送到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.getLocalHost(),9998); socket.send(packet);//发送 //5.关闭资源 socket.close(); } } ===============//SenderB//=============== public class UDPSenderB { public static void main(String[] args) throws Exception { //1.创建 DatagreamSocket 对象,准备在9998端口 接收数据 DatagramSocket socket = new DatagramSocket(9998);//同一个机器没有两个相同的端口,所以用9998 //2.将需要发送的数据,封装到DatagramPacket对象 byte[] data = "hello 明天吃火锅~".getBytes(); //封装的 DatagramPacket对象 data内容字节数组,data.length,主机(IP),端口 DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getLocalHost(),9999); socket.send(packet); //3.==接收从A端回复的信息 // (1)构造一个 DatagramPacket对象 // 一个数据包,最大是64k byte[] buf = new byte[64 * 1024]; packet = new DatagramPacket(buf, buf.length); // (2)调用 接受方法,将通过网络传输的 DatagramPacket对象填充到packet对象 // 当有数据包发送到9998端口时,就会接收到数据,如果没有数据包发送到,就会阻塞等待 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端退出"); } }