1. 程式人生 > >基於UDP協議的Socket程式設計——使用Socket程式設計實現客戶諮詢

基於UDP協議的Socket程式設計——使用Socket程式設計實現客戶諮詢

利用UDP通訊的兩個端點是平等的,也就是說通訊的兩個程式關係是對等的,沒有主次之分,甚至它們的程式碼都可以完全一致,這一點要與基於TCP協議的Socket程式設計區分開來。

步驟:

1、利用DatagramPacket物件封裝資料包。

2、利用DatagramSocket物件傳送資料包。

3、利用DatagramSocket物件接收資料包。

4、利用DatagramPacket物件處理資料包。

模擬客戶諮詢的功能,實現:傳送方傳送諮詢問題,接收方接收顯示傳送來的諮詢問題。

傳送方實現步驟:

1、獲取本地主機的InetAddress物件。

2、建立DatagramPacket物件,封裝要傳送的資訊。

3、用DatagramSocket物件將DatagramPacket物件資料傳送出去。

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Sender {
	public static void main(String[] args) {
		try {
			// 獲取本地主機地址
			InetAddress ia = InetAddress.getLocalHost();

			Scanner can = new Scanner(System.in);

			// 建立DatagramSocket物件,向接收方傳送資料
			DatagramSocket ds;

			while (true) {
				System.out.println("請輸入要諮詢的問題:");
				String str = can.nextLine();
				// 建立DatagramPacket物件,封裝資料
				DatagramPacket dp = new DatagramPacket(str.getBytes(), str.getBytes().length, ia, 6000);
				ds = new DatagramSocket();
				ds.send(dp);
			}
			// 關閉DatagramSocket物件
			// ds.close();

		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

接收方實現步驟:

1、建立DatagramPacket物件,準備接收封裝的資料。

2、建立DatagramSocket物件,接收資料保存於DatagramPacket物件中。

3、利用DatagramPacket物件處理資料。

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Receiver {
	public static void main(String[] args) {
		try {
			// 建立DatagramPacket物件,用來準備接收資料
			DatagramSocket ds = new DatagramSocket(6000);

			System.out.println("接收方已開啟!");
			while (true) {
				// 接收資料
				byte[] b = new byte[1024];
				DatagramPacket dp = new DatagramPacket(b, b.length);
				ds.receive(dp);
				// 顯示接收到的資訊
				String str = new String(dp.getData(), 0, dp.getData().length);
				System.out.println(dp.getAddress().getHostAddress() + "傳送的資料為:" + str);

			}
			// ds.close();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}
//Sender傳送訊息
請輸入要諮詢的問題:
我是誰?
請輸入要諮詢的問題:
你是誰?
請輸入要諮詢的問題:
我在幹嘛?
請輸入要諮詢的問題:

//Receiver結果
接收方已開啟!
192.168.199.153傳送的資料為:我是誰?
192.168.199.153傳送的資料為:你是誰?
192.168.199.153傳送的資料為:我在幹嘛?

<<<<=======升級=======>>>>接收方接收到傳送方傳送的訊息之後,給傳送方一個迴應

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;

public class ReceiverAndSender {
	public static void main(String[] args) {
		try {
			// 建立DatagramPacket物件,用來準備接收資料
			DatagramSocket ds = new DatagramSocket(6000);

			System.out.println("接收方已開啟!");
			// 接收資料
			byte[] b = new byte[1024];
			DatagramPacket dp = new DatagramPacket(b, b.length);
			ds.receive(dp);
			// 顯示接收到的資訊
			String str = new String(dp.getData(), 0, dp.getData().length);
			System.out.println(dp.getAddress().getHostAddress() + "傳送的資料為:" + str);

			ds.close();

			// 傳送迴應
			// 獲取本地主機地址
			InetAddress ia = InetAddress.getLocalHost();

			Scanner can = new Scanner(System.in);

			// 建立DatagramSocket物件,向接收方傳送資料
			DatagramSocket ds2;

			System.out.println("請輸入你的迴應:");
			String str2 = can.nextLine();
			// 建立DatagramPacket物件,封裝資料
			DatagramPacket dp2 = new DatagramPacket(str2.getBytes(), str2.getBytes().length, ia, 6001);
			ds2 = new DatagramSocket();
			ds2.send(dp2);

			// 關閉DatagramSocket物件
			ds2.close();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

public class SenderAndReceiver {
	public static void main(String[] args) {
		try {
			// 獲取本地主機地址
			InetAddress ia = InetAddress.getLocalHost();

			Scanner can = new Scanner(System.in);

			System.out.println("請輸入要諮詢的問題:");
			String str = can.nextLine();

			// 建立DatagramPacket物件,封裝資料
			DatagramPacket dp = new DatagramPacket(str.getBytes(), str.getBytes().length, ia, 6000);

			// 建立DatagramSocket物件,向接收方傳送資料
			DatagramSocket ds = new DatagramSocket();
			ds.send(dp);

			// 關閉DatagramSocket物件
			ds.close();

			// 接收資料
			byte[] b = new byte[1024];
			DatagramPacket dp2 = new DatagramPacket(b, b.length);

			// 準備接收回應
			DatagramSocket ds2 = new DatagramSocket(6001);
			ds2.receive(dp2);

			System.out.println("對方已回答:");
			// 顯示接收到的資訊
			String str2 = new String(dp2.getData(), 0, dp2.getData().length);
			System.out.println(dp2.getAddress().getHostAddress() + "的回答:" + str2);

		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
請輸入要諮詢的問題:
我是誰?
對方已回答:
192.168.199.153的回答:你是你啊~

接收方已開啟!
192.168.199.153傳送的資料為:我是誰?
請輸入你的迴應:
你是你啊~