Java使用UDP协议进行通信的基本流程
传输层协议:UDP,非面向连接的协议,只管把数据按照指定的地址发出去。
一般过程:DatagramSocket和DatagramPacket配合,通过send,reseive,发出接收数据包。
传输过程:
发送端:
1、使用DatagramSocket指定端口,创建发货地址。
2、把要传输的数据打包到字节数组中。
3、使用DatagramPacket将数据和目的地信息打包:new DatagramPacket(字节数组,off,length,目标地址,目标端口)
4、使用DatagramSocket对象的send(DatagramPacket packe)方法将打包好的数据发出。
5、通过close方法关闭资源。
接收端:
1、使用DatagramSocket指定端口,确定收获地址。
2、准备好一个接受数据的包new DatagramPacket(一个字节数组,off,length) 这个包的大小就是字节数组的大小。
3、使用DatagramSocket对象的receive(DatagramPacket packet)方法阻塞式接受数据到准备好的包中。
4、packet.getData()即可获取包内信息。
5、通过close方法关闭资源。
例子:
实现了在本机上,不同端口之间的通信。
实现接收代码:
public class MyServe { private final int localport; /** * @param localport 接收端使用的端口号 */ public MyServe(int localport) { this.localport = localport; } //接收端 void server() throws IOException { // 1.使用DatagramSocket 指定端口 创建接收端 DatagramSocket server = new DatagramSocket(this.localport); //2.准备容器 封装成DatagramPacket包裹 byte[] container= new byte[1024*60]; DatagramPacket packet = new DatagramPacket(container,0,container.length); while (true) { //3.阻塞式接受包裹receive(DatagramPacket p) server.receive(packet); // 4.分析数据 String data = new String(packet.getData(), 0, packet.getLength()); System.out.println("对面说:" + data); if(data.equals("byby")){ System.out.println("对面离开了聊天室"); break; } } // 5.释放资源 server.close(); } }
实现发送代码:
public class MyClint { private final int localport; private int destPort; private String destAddress; /** * * @param localport 发送端使用的端口号 * @param destPort 目的地端口号 * @param destAddress 目的地地址 */ public MyClint(int localport, int destPort, String destAddress) { this.localport = localport; this.destPort = destPort; this.destAddress = destAddress; } //发送端 void client() throws IOException { // 1.使用DatagramSocket 指定端口 创建发送端 DatagramSocket client = new DatagramSocket(this.localport); BufferedReader bd=null; bd= new BufferedReader(new InputStreamReader(System.in)); while (true) { // 2.准备数据,转成字节数组 String data = bd.readLine(); byte[] datas = data.getBytes(); // 3.封装成DatagramPacket包裹,指定目的地 DatagramPacket packet = new DatagramPacket( datas, 0, datas.length, new InetSocketAddress(this.destAddress, this.destPort)); // 4.发送包裹send(DatagramPacket p) client.send(packet); if(data.equals("byby")){break;} } if(bd!=null) bd.close(); // 5.释放资源 client.close(); } }
用户一:
public class User1 { public static void main(String[] args) throws IOException { //开启发送端服务 new Thread(()-> { try { new MyClint(8787, 8888, "localhost").client(); } catch (IOException e) { e.printStackTrace(); } }).start(); //开启接收端服务 new Thread(()-> { try { new MyServe(9999).server(); } catch (IOException e) { e.printStackTrace(); } }).start(); } }
用户二:
public class User2 { public static void main(String[] args) throws IOException { //开启发送端服务 new Thread(()-> { try { new MyClint(7878, 9999, "localhost").client(); } catch (IOException e) { e.printStackTrace(); } }).start(); //开启接收端服务 new Thread(()-> { try { new MyServe(8888).server(); } catch (IOException e) { e.printStackTrace(); } }).start(); } }
启动用户一和用户二后,运行结果: