您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java怎么實(shí)現(xiàn)基于UDP協(xié)議的網(wǎng)絡(luò)通信UDP編程”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“Java怎么實(shí)現(xiàn)基于UDP協(xié)議的網(wǎng)絡(luò)通信UDP編程”文章能幫助大家解決問題。
類DatagramSocket和DatagramPacket【數(shù)據(jù)包/數(shù)據(jù)報(bào)】實(shí)現(xiàn)了基于UDP協(xié)議網(wǎng)絡(luò)程序。
UDP數(shù)據(jù)報(bào)通過數(shù)據(jù)報(bào)套接字DatagramSocket發(fā)送和接收,系統(tǒng)不保證UDP數(shù)據(jù)報(bào)一定能安全送到目的地,也不確信什么時(shí)候可以抵達(dá)。
DatagramPacket對象封裝了UDP數(shù)據(jù)報(bào),在數(shù)據(jù)報(bào)中包含了發(fā)送端的IP地址和端口號(hào)以及接收端的IP地址和端口號(hào)。
UDP協(xié)議中每個(gè)數(shù)據(jù)報(bào)都給出了完整的地址信息,因此無須建立發(fā)送方和接收方的連接。
核心的兩個(gè)類/對象DatagramSocket域DatagramPacket
建立發(fā)送端,接收端。
建立數(shù)據(jù)包
調(diào)用DatagramSocket的發(fā)送、接收方法
關(guān)閉DatagramSocket。
UDP網(wǎng)絡(luò)編程原理示意圖
UDP說明:
沒有明確的服務(wù)端和客戶端,演變成數(shù)據(jù)的發(fā)送端和接收端。
接收數(shù)據(jù)和發(fā)生數(shù)據(jù)是通過DatagramSocket對象完成。
將數(shù)據(jù)封裝到DatagramPacket對象/裝包。
當(dāng)接收到DatagramPacket對象,需要進(jìn)行拆包,取出數(shù)據(jù)
DatagramSocket可以指定在哪個(gè)端口接收數(shù)據(jù)。
package com.study.srv.demo18; import java.io.IOException; import java.net.*; /** * @version 1.0 * UDP發(fā)送端 */ public class Demo11 { public static void main(String[] args) throws IOException { //1.創(chuàng)建DatagramSocket對象,準(zhǔn)備發(fā)送和接收數(shù)據(jù),在9998端口接收 DatagramSocket datagramSocket = new DatagramSocket(9998); //2.將需要發(fā)送的數(shù)據(jù),封裝到DatagramPacket對象 String s="發(fā)送的數(shù)據(jù)"; byte[] buf=s.getBytes(); InetAddress ip = InetAddress.getByName("192.168.0.18"); //說明:封裝的DatagramPacket對象 //buf 內(nèi)容字節(jié)數(shù)組 //buf.length 數(shù)據(jù)長度 //ip 主機(jī)(ip) //9999 端口 DatagramPacket packet = new DatagramPacket(buf, buf.length, ip, 9999); //發(fā)送數(shù)據(jù) datagramSocket.send(packet); //關(guān)閉資源 // datagramSocket.close(); System.out.println("發(fā)送完畢"); //發(fā)送端變?yōu)榻邮斩私邮諗?shù)據(jù) byte[] bytes = new byte[1024]; DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length); datagramSocket.receive(datagramPacket); int length = datagramPacket.getLength(); byte[] data = datagramPacket.getData(); String string = new String(data, 0, length); System.out.println(string); datagramSocket.close(); System.out.println("接受結(jié)束"); } }
package com.study.srv.demo18; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; /** * @version 1.0 *UDP接收端 */ public class Demo10 { public static void main(String[] args) throws IOException { //1.創(chuàng)建一個(gè) DatagramSocket對象,準(zhǔn)備在9999接收數(shù)據(jù) DatagramSocket datagramSocket = new DatagramSocket(9999); //2.構(gòu)建一個(gè)DatagramPacket 對象,準(zhǔn)備接收數(shù)據(jù) //在UDP協(xié)議,一個(gè)數(shù)據(jù)包最大64k byte[] buf=new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); //3.接收方法 將通過網(wǎng)絡(luò)傳輸?shù)腄atagramPacket對象填充到packet里去。 System.out.println("接收端等待接收"); datagramSocket.receive(packet); //4.可以對packet進(jìn)行拆包,取出數(shù)據(jù),并顯示 //實(shí)際接收到的數(shù)據(jù)字節(jié)長度 int length = packet.getLength(); //實(shí)際接收到的數(shù)據(jù) byte[] data = packet.getData(); String string = new String(data, 0, length); System.out.println(string); //5.關(guān)閉資源 // datagramSocket.close(); System.out.println("接收結(jié)束"); //接收端變?yōu)榘l(fā)送端,發(fā)送數(shù)據(jù) String s="接收端變?yōu)榘l(fā)送端,發(fā)送數(shù)據(jù)"; byte[] bytes=s.getBytes(); DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("192.168.0.18"), 9998); datagramSocket.send(datagramPacket); datagramSocket.close(); System.out.println("發(fā)送完畢"); } }
關(guān)于“Java怎么實(shí)現(xiàn)基于UDP協(xié)議的網(wǎng)絡(luò)通信UDP編程”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。