UDP是不可靠但是高效的一种传输协议,不管你接收端在不在,丢进去就行了。
传输过程:
发送端:
/** * 发送端 * 1.使用 DatagramSocket 指定端口 创建发送端 * 2.准备数据,转成字节数组 * 3.封装成 DatagramPacket 包裹,指定目的地 * 4.发送包裹 send(DatagramPacket p) * 5.释放资源 */
接收端:
/** * 接收端 * 1.使用DatagramSocket 指定端口 创建接收端 * 2.准备容器 封装成DatagramPacket包裹 * 3.阻塞式接受包裹receive(DatagramPacket p) * 4.分析数据 * byte[] getData() * getLength() * 5.释放资源 */
例子:实现了在本机上,不同端口之间的通信。
实现接收代码:
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(); } }查看代码
启动用户一和用户二后,运行结果:
标签:DatagramSocket,UDP,DatagramPacket,Java,localport,接收端,例子,IOException,new From: https://www.cnblogs.com/lurenjia-bky/p/16900468.html