java Socket UDP實(shí)例詳解
UDP編程示例
服務(wù)器端:
package socket; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class UDPServer { public static void main(String[] args) throws IOException { byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length);//聲明一個(gè)用來(lái)接收數(shù)據(jù)的“包裹” DatagramSocket ds = new DatagramSocket(5678);//指定的是UDP中的端口號(hào)5678,在TCP中,還有另外一個(gè)端口號(hào)為5678的端口 while(true){ ds.receive(dp); //阻塞式的 System.out.println(new String(buf,0,dp.getLength()));//dp中獲取的數(shù)據(jù)的長(zhǎng)度 } } }
客戶端:
package socket; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketException; public class UDPClient { public static void main(String[] args) throws IOException { byte[] buf = new String("Hello").getBytes(); //UDP是無(wú)連接的,所以要在發(fā)送的數(shù)據(jù)包裹中指定要發(fā)送到的ip:port DatagramPacket dp = new DatagramPacket(buf, buf.length, new InetSocketAddress("127.0.0.1", 5678)); DatagramSocket ds = new DatagramSocket(9999); //指明發(fā)送端的端口號(hào) ds.send(dp); ds.close(); } }
說(shuō)明:
1. 嚴(yán)格意義上來(lái)講,UDP沒(méi)有server和client之分,不像TCP中有ServerSocket和Socket,UDP中只有DatagramSocket。
2. UDP和TCP的端口是分開(kāi)的,例如UDP有一個(gè)端口號(hào)為5678的端口,TCP也有一個(gè)端口號(hào)為5678的端口。
3. UDP是無(wú)連接的,所以要在發(fā)送的數(shù)據(jù)包裹中指定要發(fā)送到的ip:port。
4. 如果要發(fā)送long、int等類(lèi)型的數(shù)據(jù),則需要使用到ByteArrayOutputStream、DataOutputStream、ByteArrayInputStream、ByteArrayInputStream流類(lèi)型,如下:
服務(wù)器端:
package socket; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class UDPServer { public static void main(String[] args) throws IOException { byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); DatagramSocket ds = new DatagramSocket(5678); ByteArrayInputStream bais = null; DataInputStream dos = null; while(true){ ds.receive(dp); bais = new ByteArrayInputStream(buf); dos = new DataInputStream(bais); System.out.println(dos.readLong()); } } }
客戶端:
package socket; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketException; public class UDPClient { public static void main(String[] args) throws IOException { byte[] buf = null; long l = 100000L; ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeLong(l); buf = baos.toByteArray(); DatagramPacket dp = new DatagramPacket(buf, buf.length, new InetSocketAddress("127.0.0.1", 5678)); DatagramSocket ds = new DatagramSocket(9999); ds.send(dp); ds.close(); dos.close(); } }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Java中父類(lèi)Object的常用方法總結(jié)
這篇文章給大家介紹了Java中父類(lèi)Object的三個(gè)常用方法,對(duì)大家學(xué)習(xí)或使用Java具有一定的參考借鑒價(jià)值,有需要的朋友們下面來(lái)一起看看吧。2016-09-09System 類(lèi) 和 Runtime 類(lèi)的常用用法介紹
這篇文章主要介紹了System 類(lèi) 和 Runtime 類(lèi)的常用用法,有需要的朋友可以參考一下2014-01-01MyBatis-Plus 自動(dòng)填充的實(shí)現(xiàn)示例
MyBatis-Plus 提供了自動(dòng)填充功能,幫助開(kāi)發(fā)者在插入或更新數(shù)據(jù)時(shí),自動(dòng)為某些字段賦值,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09springboot實(shí)現(xiàn)執(zhí)行sql語(yǔ)句打印到控制臺(tái)
這篇文章主要介紹了springboot實(shí)現(xiàn)執(zhí)行sql語(yǔ)句打印到控制臺(tái)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06使用java NIO及高速緩沖區(qū)寫(xiě)入文件過(guò)程解析
這篇文章主要介紹了使用java NIO及高速緩沖區(qū)寫(xiě)入文件過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09