1. 程式人生 > >java網路程式設計:13、基於UDP的socket程式設計(三)實現相互發送接收訊息

java網路程式設計:13、基於UDP的socket程式設計(三)實現相互發送接收訊息

宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!!

文章目錄

一、前言

二、基於UDP伺服器端程式的編寫

三、基於UDP客戶端程式的編寫

四、測試列印

五、系列文章(java網路程式設計)


通過上兩篇文章:1、瞭解了基於UDP通訊的理論、基本步驟以及它跟TCP的區別,2、寫一個簡單的例項演示了一下。大家如需瞭解可參考我的系列文章,這篇將演示UDP實現相互發送接收訊息。

一、前言

上篇文章我們實現了傳送端向接收端傳送訊息的程式碼。那麼對於這個recv接收端來說,它能不能夠給我們send傳送端,回一個資訊呢?也就是說由這個接收端給我們傳送端傳送一個資訊。它首先得知道傳送端的ip地址、和傳送端程序所繫結的埠號,那麼當傳送端它傳送一個數據包的時候,那麼這個資料包當中,就有傳送端程序所在機器的ip地址和我們這個傳送端程序所繫結的埠號,那麼這個埠號是作業系統給它分配的任意一個可以利用的埠號。

那麼接收端它收到這個資料包之後,這個時候相當於是建立起來了傳送端和接收端之間的一個虛連線,那麼接收端可以通過它所收到的這個資料包,從這個資料包當中提取出來傳送端的ip地址和埠號,然後給我們傳送端傳送資料。

 

二、基於UDP伺服器端程式的編寫

	/**
	 * 基於UDP伺服器端程式的編寫
	 */
	public static void recv() {
		try {
			//建立資料報套接字物件,繫結埠號為6000
			DatagramSocket ds = new DatagramSocket(6000);
			//構建資料包接收資料:
			//建立位元組陣列
			byte[] buf = new byte[100];
			//建立資料包物件,它的長度不能超過陣列的長度,我們把它設為100
			DatagramPacket dp = new DatagramPacket(buf, 100);
			//接收資料
			ds.receive(dp);
			//列印資料
			//getLength方法返回實際接收數;getData方法返回資料,返回格式為位元組陣列
			System.out.println(new String(buf, 0, dp.getLength()));
			
			//給客戶端答覆
			String str = "Welcome you!";
			//getAddress()、getPort()方法,可獲得傳送資料時的ip地址、埠號
			DatagramPacket dpSend = new DatagramPacket(
					str.getBytes(),
					str.length(), 
					dp.getAddress(), 
					dp.getPort());
			ds.send(dpSend);
			ds.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

 

三、基於UDP客戶端程式的編寫

	/**
	 * 基於UDP客戶端程式的編寫
	 */
	public static void send() {
		try {
			//建立一個數據報物件。
			DatagramSocket ds = new DatagramSocket();
			//要傳送的資料
			String str = "Hello,this is zhangsan";
			//構造一個傳送資料包:
			//InetAddress.getByName("localhost"):獲得本地ip地址
			//埠號指定為6000
			DatagramPacket dp = new DatagramPacket(
					str.getBytes(), 
					str.length(),
					InetAddress.getByName("localhost"),
					6000);
			//傳送資料包
			ds.send(dp);
			
			//建立位元組陣列
			byte[] buf = new byte[100];
			//構建接收資料的資料包
			DatagramPacket dpRecv = new DatagramPacket(buf, 100);
			//接收資料
			ds.receive(dpRecv);
			//列印資料
			System.out.println(new String(buf, 0, dpRecv.getLength()));
			//關閉資料報套接字
			ds.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

 

四、測試列印

我們首先啟動接收端的recv方法,然後啟動傳送端的send方法,我們可以看到對於傳送端來說,它收到了接收端給它回覆的資訊,如下圖:

 

注意:

資料報套接字雖然不像我們TCP通訊時要建立連線。但是當第一次資料傳送成功之後,那麼它也是相當於建立了一個虛連線,

那麼雙方之間都可以傳送資料和讀取資料。

 

五、系列文章(java網路程式設計)

 java網路程式設計:1、計算機網路?網路通訊的組成?什麼是ip、協議、埠號?

 java網路程式設計:2、IP地址、協議、網路狀況、網路異質性問題的解決

 java網路程式設計:3、ISO/OSI七層參考模型

 java網路程式設計:4、OSI各層所使用的協議

 java網路程式設計:5、資料封裝

 java網路程式設計:6、TCP/IP模型、TCP/IP模型與OSI參考模型的對應關係

 java網路程式設計:7、埠、套接字(socket)的引入

 java網路程式設計:8、基於TCP的socket程式設計(一)簡單的socket通訊_一個客戶端

 java網路程式設計:9、基於TCP的socket程式設計(二)伺服器端迴圈監聽接收多個客戶端_多執行緒伺服器程式

 java網路程式設計:10、基於TCP的socket程式設計(三)緩衝流、flush方法、關閉流

 java網路程式設計:11、基於UDP的socket程式設計(一)理論、基本步驟

 java網路程式設計:12、基於UDP的socket程式設計(二)程式碼通訊-簡單例項

 java網路程式設計:13、基於UDP的socket程式設計(三)實現相互發送接收訊息