Java--NIO-UDP Socket。本站提示廣大學習愛好者:(Java--NIO-UDP Socket)文章只能為提供參考,不一定能成為您想要的結果。以下是Java--NIO-UDP Socket正文
1、首先使用DatagramSocket實現UDP Socket客戶端,並且使用DatagramPacket封裝要發送和接收的數據
package com.seeyon.nio.UDP; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * Created by yangyu on 2017/2/23. */ public class UdpClient { public static void main(String[] args) { try(DatagramSocket datagramSocket = new DatagramSocket()) { InetAddress inetAddress = InetAddress.getByName("localhost"); datagramSocket.connect(inetAddress,8777); byte[] bytes = "this is first message".getBytes("UTF-8"); DatagramPacket request = new DatagramPacket(bytes,bytes.length); byte[] bytes1 = "this is second message...........".getBytes("UTF-8"); DatagramPacket response = new DatagramPacket(new byte[1024],1024); datagramSocket.send(request); request.setData(bytes1); request.setLength(bytes1.length); datagramSocket.send(request); datagramSocket.receive(response); System.out.println(new String(response.getData(),0,response.getLength(),"UTF-8")); } catch (Exception e) { e.printStackTrace(); } } }
2、使用DatagramSocket 實現UDP Socket服務端,並且使用DatagramPacket封裝需要接收與發送的數據
package com.seeyon.nio.UDP; import java.net.DatagramPacket; import java.net.DatagramSocket; /** * Created by yangyu on 2017/2/23. */ public class UdpServer { public static void main(String[] args) { try(DatagramSocket datagramSocket = new DatagramSocket(8777)) { DatagramPacket request = new DatagramPacket(new byte[1024],1024); System.out.println(request.getLength()); while (true){ datagramSocket.receive(request); System.out.println(request.getLength()); System.out.println(request.getSocketAddress()); System.out.println(request.getAddress()+":"+request.getPort()); System.out.println(new String(request.getData(),0,request.getLength(),"UTF-8")); byte[] bytes = "你好,我是服務器".getBytes("UTF-8"); DatagramPacket response = new DatagramPacket(bytes,bytes.length,request.getAddress(),request.getPort()); datagramSocket.send(response); /** * Java網絡編程(第四版)上說這裡需要重設packet大小,因為接收第一個數據報以後會將DatagramPacket中buffer大小設置為第一個數據報的大小 * * 其實並不是這樣,在JDK1.8中,DatagramPacket中的length只是接收到的數據報的length,而其中還含有一個bufferLength * 而bufferLength才是緩沖區大小,根據源碼所得而且在接收數據報時,只是更改了DatagramPacket中的length而並沒有更改 * bufferLength,所以並不會影響下一個數據報的接收; * * 所以數據報能否接收完整,跟第一個數據報大小無關,而跟DatagramPacket中buffer大小有關 */ //request.setLength(1024); } } catch (Exception e) { e.printStackTrace(); } } }