1. 程式人生 > >使用UDP實現兩端互相通訊

使用UDP實現兩端互相通訊

傳送端 應用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為阻塞式方法。如果沒有收到東西則會一直等待,所以先執行接收端,讓它等待,再執行傳送端,讓它傳送資料。

執行結果為:
在這裡插入圖片描述