UDP/TCP

网络通信三要素

IP地址

IP(Internet Protocol):全称”互联网协议地址”,是分配给上网设备的唯一标志。
常见的IP分类为:IPv4和IPv6
IP地址形式:
公网地址、和私有地址(局域网使用)。
192.168. 开头的就是常见的局域网地址,范围即为192.168.0.0--192.168.255.255,专门为组织机构内部使用。
InetAddress API的使用

  • 此类表示Internet协议(IP)地址

端口

应用程序在设备中唯一的标识,被规定为一个 16 位的二进制,范围是 0~65535。
注意:我们自己开发的程序选择注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错。

端口类型
周知端口:0~1023,被预先定义的知名应用占用(如:HTTP占用 80,FTP占用21)
注册端口:1024~49151,分配给用户进程或某些应用程序。(如:Tomcat占 用8080,MySQL占用3306)
动态端口:49152到65535,之所以称为动态端口,是因为它 一般不固定分配某种进程,而是动态分配

协议

传输层的2个常见协议

  • TCP(Transmission Control Protocol) :传输控制协议
  • UDP(User Datagram Protocol):用户数据报协议

网络通信协议有两套参考模型

  • OSI参考模型:世界互联协议标准,全球通信规范,由于此模型过于理想化,未能在因特网上进行广泛推广。
  • TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。

TCP协议特点

  • 使用TCP协议,必须双方先建立连接,它是一种面向连接的可靠通信协议。
  • 传输前,采用“三次握手”方式建立连接,所以是可靠的 。
  • 在连接中可进行大数据量的传输 。
  • 连接、发送数据都需要确认,且传输完毕后,还需释放已建立的连接,通信效率较低。

TCP协议通信场景
对信息安全要求较高的场景,例如:文件下载、金融等数据通信。

TCP三次握手确立连接

TCP四次挥手断开连接

UDP协议特点

  • UDP是一种无连接、不可靠传输的协议。
  • 将数据源IP、目的地IP和端口封装成数据包,不需要建立连接
  • 每个数据包的大小限制在64KB内
  • 发送不管对方是否准备好,接收方收到也不确认,故是不可靠的
  • 可以广播发送 ,发送数据结束时无需释放资源,开销小,速度快。

UDP协议通信场景
语音通话,视频会话等。

UDP通信

DatagramPacket:数据包对象(韭菜盘子)

DatagramPacket常用方法

DatagramSocket:发送端和接收端对象(人)

DatagramSocket类成员方法

使用UDP通信实现:发送消息、接收消息

/**
 * 发送端
 */
public class ClientDemo1 {
    public static void main(String[] args) throws Exception {
        // 1.创建发送端对象
        DatagramSocket socket = new DatagramSocket();
        // 2. 创建数据包对象(韭菜盘子)
        //    public DatagramPacket(byte buf[], int length,InetAddress address, int port)
        // 参数一:封装要发送的数据(韭菜)
        // 参数二:发送的数据的大小
        // 参数三:服务端的IP地址
        // 参数四:服务端的端口
        byte[] buffer = "韭菜盒子".getBytes();
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getLocalHost(), 8888);
        socket.send(packet);
        socket.close();
    }
}

/**
 * 接收端
 */
public class ServerDemo2 {
    public static void main(String[] args) throws Exception {
        // 1.创建接收端对象
        DatagramSocket socket = new DatagramSocket(8888);
        byte[] buffer= new byte[1024*64];
        // 2.创建一个数据包对象接收数据
        DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
        // 3. 接收数据
        socket.receive(packet);
        System.out.println(packet.getLength()); //获得实际接收到的字节个数
        // 4.取出数据
        String rs = new String(buffer,0,packet.getLength());
        System.out.println("收到了:"+rs);

        // 获取发送端的ip和端口
        System.out.println(packet.getSocketAddress().toString());
        System.out.println(packet.getPort());
        System.out.println(packet.getAddress().toString());
        socket.close();
    }
}

UDP的三种通信方式

  • 单播:单台主机与单台主机之间的通信。
  • 广播:当前主机与所在网络中的所有主机通信。
  • 组播:当前主机与选定的一组主机的通信。

UDP如何实现广播

  • 使用广播地址:255.255.255.255
  • 具体操作:
    • 1.发送端发送的数据包的目的地写的是广播地址、且指定端口。 (255.255.255.255 , 9999)
    • 2.本机所在网段的其他主机的程序只要注册对应端口就可以收到消息了。(9999)

UDP如何实现组播

  • 使用组播地址:224.0.0.0 ~ 239.255.255.255
  • 具体操作:
    • 1.发送端的数据包的目的地是组播IP (例如:224.0.1.1, 端口:9999)
    • 2.接收端必须绑定该组播IP(224.0.1.1),端口还要注册发送端的目的端口9999 ,这样即可接收该组播消息。
    • 3.DatagramSocket的子类MulticastSocket可以在接收端绑定组播IP。

TCP通信

TCP通信模式演示


Socket

Socket类成员方法

ServerSocket(服务端)

ServerSocket类成员方法

TCP通信-同时接受多个客户端消息

同时接受多个客户端消息

  • 单线程每次只能处理一个客户端的Socket通信,引入多线程。
  • 主线程定义了循环负责接收客户端Socket管道连接。
  • 每接收到一个Socket通信管道后分配一个独立的线程负责处理它。

TCP通信-使用线程池优化

使用线程池的优势在哪里?

  • 服务端可以复用线程处理多个客户端,可以避免系统瘫痪。
  • 适合客户端通信时长较短的场景。

即时通信

  • 即时通信,是指一个客户端的消息发出去,其他客户端可以接收到
  • 即时通信需要进行端口转发的设计思想。
  • 服务端需要把在线的Socket管道存储起来
  • 一旦收到一个消息要推送给其他管道

模拟BS系统

TCP通信如何实现BS请求网页信息回来呢?

  • 客户端使用浏览器发起请求(不需要开发客户端)
  • 服务端必须按照浏览器的协议(HTTP协议)规则响应数据。

posted @ 2022-11-08 10:07  晚点心动。  阅读(112)  评论(0)    收藏  举报