UDP是一种不可靠的协议,它在通信两端各建立一个socket,这两个socket不会建立持久的通信连接,只会单方面向对方发送数据,不检查发送结果。
java中基于UDP协议的通信使用DatagramSocket类的receive和send方法即可,但消息需要通过一个特定的类封装(DatagramPacket)
下面是一个基于UDP协议的通信的例子,
服务器端,
package udp; import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket; public class Server {
private static final int PORT = 3000;
//数据报大小
private static final int DATA_LEN = 4096;
//接受网络数据的字节数组
byte[] inBuff = new byte[DATA_LEN];
//接收数据
private DatagramPacket inPacket = new DatagramPacket(inBuff, inBuff.length);
//发送数据
private DatagramPacket outPacket;
String[] books = new String[]
{
"疯狂英语",
"康熙词典",
"TCP协议",
"NIO非阻塞channel"
};
public void init() throws IOException {
try {
DatagramSocket socket = new DatagramSocket(PORT);
for (int i = 0; i < 1000; i++) {
//读取socket中的数据
socket.receive(inPacket);
System.out.println(inBuff == inPacket.getData());
System.out.println(new String(inBuff, 0, inPacket.getLength())); byte[] sendData = books[i % 4].getBytes();
outPacket = new DatagramPacket(sendData, sendData.length, inPacket.getAddress(), PORT);
socket.send(outPacket);
}
} catch (IOException e) {
e.printStackTrace();
}
} public static void main(String[] args) throws IOException {
new Server().init();
}
}
客户端,
package udp; import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner; public class Client {
private static final int PORT = 3000;
//数据报大小
private static final int DATA_LEN = 4096;
private static final String DEST_IP = "127.0.0.1";
//接受网络数据的字节数组
byte[] inBuff = new byte[DATA_LEN];
//接收数据
private DatagramPacket inPacket = new DatagramPacket(inBuff, inBuff.length);
//发送数据
private DatagramPacket outPacket; public void init() throws IOException {
try {
//使用随机端口创建socket
DatagramSocket socket = new DatagramSocket();
outPacket = new DatagramPacket(new byte[0], 0, InetAddress.getByName(DEST_IP), PORT);
Scanner scann = new Scanner(System.in);
while (scann.hasNextLine()) {
byte[] buff = scann.nextLine().getBytes();
outPacket.setData(buff);
socket.send(outPacket);
socket.receive(inPacket);
System.out.println(new String(inBuff, 0, inPacket.getLength()));
}
} catch(IOException e) {
e.printStackTrace();
}
} public static void main(String[] args) throws IOException {
new Client().init();
}
}
执行结果,启动一个服务器端,再启动一个客户端发一条信息,服务器端输出了信息,
aaarticlea/png;base64,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ePcTDnjPEw54zxNe8J4nbk8XP/GFF/9KmF703l+N04sveVKYDrzkSQde8uQDL33ygZc++SWXPvkllz7lJZc95aWXPeWll/1amA66/NcOuvypB13+1IMvf+rBVzz14CuedvAVTzvkiqcd8r6nHfK+Xz/kfb/+sjD9yW+8fHv6zZe//zdfsT391ivf/1uv/ECYnn7oB55+6JVPP/TKpx925TMOu/IZh131jMOu+u3D906v+uDvxOnVH3pmmF7zoWe+5sP/KUxHfPhZR3z4WUdc/awjrn7WkVc/+8irn33kNc8+6ppnH3XNc8J09LXPOfra5x597XOPufa5x1z33GOue94x1z3v2Oued+z1zz/2+ue/dns64LU3HHDc9vSC42+M0wtPuPGFJ3zkhSd85EWvC9NNL3rdTS/+3TB99MWv/+iBcfq9j71k7/TS3795ezrx5oNOvPmgE2856MRbDjrploNPuuXgk249+ORbDz751kNOvvWQk2875JTbDjnltpedctvL3nDby97w8ZeH6Y0ff/kbP/GKN37iFaeG6ZOvPPWTrzxtezr0TbeH6bA33X7Y6Z8K0+Gnf+rwMz51+Bl3HH7GHa96c5jufNWb73z1H4TpT1/zh/umI/7o09vTmZ8+8sy7tqez7jrqrLuOOuvuo86++6iz7z767LuPPvueo99yzzFheutnjnnrZ44N0zmfOfacz772nM++9tww7Tru3F3HnbfruPN2HX/eruPPu/f48+89/vx7Tzj/3hMu+FyYXnfB51534Z+F6XffFqbPv/5tn3/9H4fpz3/v7XH6wu+/Y+900RdOvOiL29M7v3jSO7900ju/dNK7vnTy9vTlk9/95VO2p6+c8p6vvCFMF3/1DRd/9Y1heu9XT33vfae+975TL7nv1EvuO+2S+0+75P7TLr3/tEvvf9Ol97/psq+F6fTLvnb65Q+cfvkDZ1z+wBlXPHDGFV8/44qvv/mKr7/5fWH6xh/8SZz+4g/fv2/6ow98M0xnXvnNM6/8VpjOuupbZ1314FlXPXjWBx88e3v69tkf+vZbwvThv3xrnK7+zjlhuuY751zznXOveejcax4699qHzr32ofOuffi86x4+77qHzw/T9Y+cf/0jF1z/yAU3PHLBDY9ecMOjF97w6IU3PnrhjY9deONjb7vxsbd9JEzf/eObtqe33/S9t390e3rH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" alt="" />