UDP是一种不可靠的协议,它在通信两端各建立一个socket,这两个socket不会建立持久的通信连接,只会单方面向对方发送数据,不检查发送结果。
java中基于UDP协议的通信使用DatagramSocket类的receive和send方法即可,但消息需要通过一个特定的类封装(DatagramPacket)
下面是一个基于UDP协议的通信的例子,
服务器端,
1 package udp; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 7 public class Server { 8 private static final int PORT = 3000; 9 //数据报大小 10 private static final int DATA_LEN = 4096; 11 //接受网络数据的字节数组 12 byte[] inBuff = new byte[DATA_LEN]; 13 //接收数据 14 private DatagramPacket inPacket = new DatagramPacket(inBuff, inBuff.length); 15 //发送数据 16 private DatagramPacket outPacket; 17 String[] books = new String[] 18 { 19 "疯狂英语", 20 "康熙词典", 21 "TCP协议", 22 "NIO非阻塞channel" 23 }; 24 public void init() throws IOException { 25 try { 26 DatagramSocket socket = new DatagramSocket(PORT); 27 for (int i = 0; i < 1000; i++) { 28 //读取socket中的数据 29 socket.receive(inPacket); 30 System.out.println(inBuff == inPacket.getData()); 31 System.out.println(new String(inBuff, 0, inPacket.getLength())); 32 33 byte[] sendData = books[i % 4].getBytes(); 34 outPacket = new DatagramPacket(sendData, sendData.length, inPacket.getAddress(), PORT); 35 socket.send(outPacket); 36 } 37 } catch (IOException e) { 38 e.printStackTrace(); 39 } 40 } 41 42 public static void main(String[] args) throws IOException { 43 new Server().init(); 44 } 45 }
客户端,
1 package udp; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 import java.net.InetAddress; 7 import java.util.Scanner; 8 9 public class Client { 10 private static final int PORT = 3000; 11 //数据报大小 12 private static final int DATA_LEN = 4096; 13 private static final String DEST_IP = "127.0.0.1"; 14 //接受网络数据的字节数组 15 byte[] inBuff = new byte[DATA_LEN]; 16 //接收数据 17 private DatagramPacket inPacket = new DatagramPacket(inBuff, inBuff.length); 18 //发送数据 19 private DatagramPacket outPacket; 20 21 public void init() throws IOException { 22 try { 23 //使用随机端口创建socket 24 DatagramSocket socket = new DatagramSocket(); 25 outPacket = new DatagramPacket(new byte[0], 0, InetAddress.getByName(DEST_IP), PORT); 26 Scanner scann = new Scanner(System.in); 27 while (scann.hasNextLine()) { 28 byte[] buff = scann.nextLine().getBytes(); 29 outPacket.setData(buff); 30 socket.send(outPacket); 31 socket.receive(inPacket); 32 System.out.println(new String(inBuff, 0, inPacket.getLength())); 33 } 34 } catch(IOException e) { 35 e.printStackTrace(); 36 } 37 } 38 39 public static void main(String[] args) throws IOException { 40 new Client().init(); 41 } 42 }
执行结果,启动一个服务器端,再启动一个客户端发一条信息,服务器端输出了信息,
时间: 2024-10-11 07:38:09