UDP简介
java.net.ServerSocket和java.net.Socket是建立在TCP协议基础上。TCP协议传输可靠,但是速度没有UDP快。
UDP的缺点是不可靠,无法保证数据一定能够到达目的地,和目标接收数据包的顺序。
UDP适合传输视频、音频。而TCP适合可靠的协议应用,比如FTP、HTTP。
UDP在java中的api主要是java.util.DatagramSocket类。每个DatagramSocket与一个本地地址绑定,每个DatagramSocket可以把UDP数据包发给任意一个远程DatagramSocket,也可以接收来自任意一个远程DatagramSocket的UDP数据包。
TCP通信必须Client和Server先建立连接,UDP不用建立连接,直接发送数据包。
示例
public class EchoServer {
private int port = 8000;
private DatagramSocket socket;
public EchoServer() throws IOException {
socket = new DatagramSocket(port); //与本地的一个固定端口绑定
System.out.println("服务器启动");
}
public String echo(String msg) {
return "echo:" + msg;
}
public void service() {
while (true) {
try {
byte[] buf = new byte[512];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet); //接收来自任意一个EchoClient的数据报
String msg = new String(packet.getData(), 0, packet.getLength());
System.out.println(packet.getAddress() + ":" + packet.getPort() + ">" + msg);
//给EchoClient回复一个数据报
packet.setData(echo(msg).getBytes());
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String args[]) throws IOException {
new EchoServer().service();
}
}
public class EchoClient {
private String remoteHost = "localhost";
private int remotePort = 8000;
private DatagramSocket socket;
public EchoClient() throws IOException {
socket = new DatagramSocket(); //与本地的任意一个UDP端口绑定
}
public static void main(String args[]) throws IOException {
new EchoClient().talk();
}
public void talk() throws IOException {
try {
InetAddress remoteIP = InetAddress.getByName(remoteHost);
BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in));
String msg = null;
while ((msg = localReader.readLine()) != null) {
byte[] outputData = msg.getBytes();
DatagramPacket outputPacket = new DatagramPacket(outputData,
outputData.length, remoteIP, remotePort);
socket.send(outputPacket); //给EchoServer发送数据报
byte[] bytes = new byte[512];
DatagramPacket inputPacket = new DatagramPacket(bytes, bytes.length);
socket.receive(inputPacket);
System.out.println(new String(inputPacket.getData(), 0, inputPacket.getLength()));
if (msg.equals("bye")) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
socket.close();
}
}
}