基於UDP協議的Socket程式設計——使用Socket程式設計實現客戶諮詢
阿新 • • 發佈:2019-02-11
利用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傳送的資料為:我是誰?
請輸入你的迴應:
你是你啊~