使用UDP實現兩端互相通訊
阿新 • • 發佈:2018-12-06
傳送端 應用A,指定埠號為10000,ip地址為本地地址:
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class Demo2 { public static void main(String[] args) throws IOException { /* * 建立UDP傳輸的傳送端 傳送快遞 * 1.建立一個UDP的socket服務 先建立快遞點 * 2.將要傳送的資料封裝到資料包中 將寄的快遞封裝到袋子中 * 3.通過UDP的scocket服務將資料包傳送出去 * 4.關閉socket服務,釋放資源 */ //1.建立UDP服務 DatagramSocket //傳送端 應用A,埠號為10000,ip為本地地址 //指定埠號的建構函式 DatagramSocket ds=new DatagramSocket(10000); //2.資料打包 String str="哥們來了..."; //由於DatagramPocket物件處理的都是byte型別的。所以需要將字串轉換為byte byte[] buf=str.getBytes(); //buf: byte陣列 //offset:偏移量 //length:陣列的長度 //address:對方的ip地址,要傳送給誰(這裡傳送給自己) //port:傳送的埠號 DatagramPacket dp=new DatagramPacket(buf, 0, buf.length, InetAddress.getLocalHost(), 10001); //3.傳送出去 ds.send(dp);//此時可能會報IO異常 //4.關閉服務 ds.close(); } }
接收端 應用B,指定埠號為10001,ip地址同樣採用本地地址(所以應用A與應用B在同一地址內)
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class Demo3 { public static void main(String[] args) throws IOException { /* * 建立UDP接收端的思路 取快遞 * 1.建立UDP的socket服務 快遞點 * 2.建立資料包,用於儲存接收的資料 拿個袋子用於裝快遞 * 3.使用SOCKET的receive方法將接收的資料儲存到資料包中 裝入袋子中 * 4.通過資料包中的方法解析資料包中的資料 拆開袋子 * 5.關閉資源 */ //1.建立UDP socket服務 //接收端 應用B,埠號為10001,ip為本地地址,與應用A在同一地址中 DatagramSocket ds=new DatagramSocket(10001); //2.建立資料包 byte[] buf=new byte[1024];//指定建立的資料包的大小 DatagramPacket dp=new DatagramPacket(buf, buf.length); //3.使用接收方法接收資料放入資料包中 //receive為阻塞式方法。如果沒有收到東西則會一直等待,所以先執行接收端,讓它等待,在執行傳送端,讓它傳送資料 ds.receive(dp);//將接受得到的資料包存到dp資料包中 //4.解析資料包中的資訊 String ip=dp.getAddress().getHostAddress();//到底是誰發過來的 int port=dp.getPort();//從哪個埠號發過來的 byte[] b=dp.getData();//將資料包中的資料取出放到b陣列中 String str=new String(b, 0, b.length); System.out.println(ip+"..."+port); System.out.println(str); //5.關閉資源 ds.close(); } }
需要注意的問題:
receive為阻塞式方法。如果沒有收到東西則會一直等待,所以先執行接收端,讓它等待,再執行傳送端,讓它傳送資料。
執行結果為: