首页 > 技术文章 > Java网络编程TCP/UDP

hanchuge 2021-06-08 23:12 原文

通信协议

  • TCP和UDP协议是TCP/IP协议的核心。 TCP 传输协议:TCP 协议是一TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。

TCP

打电话的机制, 必须双方建立连接才能通信

  • 三次握手(建立连接)
    • A:你瞅啥
    • B:瞅你咋地
    • A:哎我去
  • 四次挥手(断开连接)
    • A:走了哈老铁
    • B:真要走了?老铁?
    • B:真的要走了?不再来点?
    • A:不来了,真要走了。

TCP的主要类

  1. InetAddress:不能new, 可以通过getByName方法获得实例

    InetAddress localhost = InetAddress.getByName("localhost");
    InetAddress localhost = InetAddress.getByName("127.0.0.1");
    
  2. Socket:客户端类 (InetAddress,端口号)

    Socket Socketsocket = new Socket(serverIP, 8080);
    
    // 发送消息给服务器
    os = socket.getOutputStream();
    os.write("您好,服务器".getBytes(StandardCharsets.UTF_8));
    socket.shutdownOutput();
    
    // 接受消息
    InputStream inputStream = socket.getInputStream();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] msgBuffer = new byte[1024];
    int len2;
    while ((len2 = inputStream.read(msgBuffer)) != -1) {
        baos.write(msgBuffer, 0, len2);
    }
    System.out.println(baos.toString());
    socket.shutdownInput();
    
  3. ServerSocket:服务器端类

    ServerSocket serverSocket = new ServerSocket(8080);
    
    // 监听客户端信息
    accept = serverSocket.accept();
    
    // 读取客户端端消息
    is = accept.getInputStream();
    baos = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int len;
    while ((len = is.read(buffer)) != -1) {
        baos.write(buffer, 0, len);
    }
    System.out.println(baos.toString());
    

UDP

发短信的机制, 不需要建立连接,只管发送,不管对方是否能够接收到

UDP的主要类

  • DatagramSocket(发送的主体)

    // 随机端口
    this.mySocket = new DatagramSocket();
    // 指定端口
    this.mySocket = new DatagramSocket(8080);
    
  • DatagramPacket(发送的内容)

    // 建立一个包
    String msg = "test!";
    InetAddress inetAddress = InetAddress.getByName("localhost") ;
    int port = 9000;
    DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(StandardCharsets.UTF_8), 0, msg.getBytes(StandardCharsets.UTF_8).length, inetAddress, port);
    
  • 发送信息

    // 发送包
    datagramSocket.send(datagramPacket);
    
  • 接受信息

    // 建立一个接收的socket
    DatagramSocket datagramSocket = new DatagramSocket(9000); // 端口号要和发送内容里指定的一致
    
    // 接受消息
    byte[] bytes = new byte[1024];
    DatagramPacket dataPacket = new DatagramPacket(bytes, 0, bytes.length);
    datagramSocket.receive(dataPacket);
    
    String msg = new String (dataPacket.getData(), 0, dataPacket.getData().length, StandardCharsets.UTF_8);
    System.out.println(msg);
    

推荐阅读