通信协议
- 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的主要类
-
InetAddress:不能new, 可以通过getByName方法获得实例
InetAddress localhost = InetAddress.getByName("localhost"); InetAddress localhost = InetAddress.getByName("127.0.0.1");
-
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();
-
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);