UDP:
- UDP协议端格式
- 16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度;
- 如果校验和出错, 就会直接丢弃;
UDP的特点:
- 无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接; 不可靠: 没有确认机制, 没有重传机制;
- 如果因为网络故障该段无法发到对方, UDP协议层也不 会给应用层返回任何错误信息;
- 面向数据报: 不能够灵活的控制
Socket实现:
Client:`
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class UDPClient {
private static final String IP = "82.156.51.110";
private static final int Port = 9001;
private static final int length = 1024;
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
Scanner sc = new Scanner(System.in);
while(true){
String msg = sc.nextLine();
DatagramPacket packet = new DatagramPacket(
msg.getBytes(),
msg.getBytes().length,
InetAddress.getByName(IP),
Port
);
socket.send(packet);
DatagramPacket packet1 = new DatagramPacket(new byte[length],length);
socket.receive(packet1);
System.out.println("收到服务器端的消息:"+ new String(packet1.getData()));
}
}
}
Server:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPService {
private static final int Port = 9001;
private static final int length = 1024;
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(Port);
while(true){
DatagramPacket packet = new DatagramPacket(new byte[length],length);
socket.receive(packet);
//拿到信息
String msg = new String(packet.getData());
System.out.println("接收到客户端的消息:"+msg);
//给客户端返回信息
String msg1 = "我收到了";
DatagramPacket packet1 = new DatagramPacket(
msg1.getBytes(),
msg1.getBytes().length,
packet.getAddress(),
packet.getPort());
socket.send(packet1);
}
}
}