与 TCP 协议相比, UDP 是一个无连接,不可靠的协议。 即:数据的发送方只负责将数据发送出去,数据的接受方只负责接受数据。发送方和接收方不会相互确认数据的传输是否成功。
使用 UDP 通信有点类似于写信,当我们寄信的时候,不需要想打电话一样事先准备一个连接,寄信人只知道把信寄了出去,但是对方有没有收到信,寄信人则一无所知。
相对于 TCP 而言, UDP 有一个优点:效率较高。因此,当我们在对数据传输的正确率不太关心,但是对传输效率要求较高的情况下,可以采用 UDP 协议。典型的使用 UDP 协议的是网络语音以及视频聊天用。
我们现在要从客户端向服务器端发送一个“hello server”,而服务器端回给客户端一个字符串:“hello client”。
服务器端:
package chp17;
import java.io.*;
import java.net.*;
public class UDPServer {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//创建 socket
DatagramSocket socket = new DatagramSocket(9000);
//收数据
byte[] buf = new byte[100];
DatagramPacket paper = new DatagramPacket(
buf, 0, buf.length);
socket.receive(paper);
String str = new String(buf, 0 , paper.getLength());
System.out.println(str);
//发送数据
byte[] data = "hello client".getBytes();
DatagramPacket packet = new DatagramPacket(
data, 0 ,data.length,
paper.getSocketAddress()
);
socket.send(packet);
//关闭 socket
socket.close();
}
}
客户端:
package chp17;
import java.io.*;
import java.net.*;
public class UDPClient {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
DatagramSocket socket = new DatagramSocket();
String str = "hello server";
byte[] data = str.getBytes();
DatagramPacket packet = new DatagramPacket(
data, 0, data.length,
new InetSocketAddress("10.249.151.86", 9000)
);
socket.send(packet);
byte[] buf = new byte[100];
DatagramPacket paper = new DatagramPacket(
buf, 0, buf.length
);
socket.receive(paper);
String msg = new String(buf, 0, paper.getLength());
System.out.println(msg);
socket.close();
}
}