推薦:Java網絡程式設計彙總
Java網絡程式設計-Socket程式設計初涉七(UDP協定,簡易提供-搜尋服務)
提供端
提供端作為接收資訊的一方,需要指定一個端口用于資料接收;等搜尋端把請求發送過來時,提供端接收請求資訊,并且列印請求資訊,再簡單的回送一條資訊即可。
package udp.search;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Provider {
public static void main(String[] args) throws IOException {
System.out.println("Provider Started...");
// 作為接收者,指定一個端口用于資料接收
DatagramSocket ds = new DatagramSocket(2000);
// 建構接收實體
final byte[] buf = new byte[512];
DatagramPacket receivePack = new DatagramPacket(buf , buf.length);
// 接收
ds.receive(receivePack);
// 列印接收到的資訊與發送者的資訊
// 發送者的IP位址
String ip = receivePack.getAddress().getHostAddress();
// 發送者的端口
int port = receivePack.getPort();
int dataLen = receivePack.getLength();
String data = new String(receivePack.getData() , 0 ,dataLen);
System.out.println("Provider receive form ip:"+ip+" port:"+port+" data:"+data);
// 建構一份回送資料
String responseData = "Receive data with len:" + dataLen;
byte[] responseDataBytes = responseData.getBytes();
// 直接根據發送者建構一份回送資料
DatagramPacket responsePacket = new DatagramPacket(responseDataBytes ,
responseDataBytes.length,
receivePack.getAddress(),
receivePack.getPort());
// 發送資訊
ds.send(responsePacket);
// 關閉
System.out.println("Provider Finished...");
ds.close();
}
}
搜尋端
搜尋端作為搜尋方,即請求資源的一方,無需指定端口,讓系統配置設定即可;搜尋端發送請求給提供端(需要指定提供端的IP與端口),提供端接收請求後會回送資訊,搜尋端接收提供端的回送,再列印該回送即可。
package udp.search;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Searcher {
public static void main(String[] args) throws IOException {
System.out.println("Searcher Started...");
// 作為搜尋方,無需指定端口,讓系統配置設定
DatagramSocket ds = new DatagramSocket();
// 建構一份請求資料
String requestData = "Hello World";
byte[] requestDataBytes = requestData.getBytes();
// 直接建構packet
DatagramPacket requestPacket = new DatagramPacket(requestDataBytes ,
requestDataBytes.length);
// 本地位址
requestPacket.setAddress(InetAddress.getLocalHost());
// 端口2000
requestPacket.setPort(2000);
// 發送資訊
ds.send(requestPacket);
// 建構接收實體
final byte[] buf = new byte[512];
DatagramPacket receivePack = new DatagramPacket(buf , buf.length);
// 接收
ds.receive(receivePack);
// 列印接收到的資訊與發送者的資訊
// 發送者的IP位址
String ip = receivePack.getAddress().getHostAddress();
// 發送者的端口
int port = receivePack.getPort();
int dataLen = receivePack.getLength();
String data = new String(receivePack.getData() , 0 ,dataLen);
System.out.println("Searcher receive form ip:"+ip+" port:"+port+" data:"+data);
// 關閉
System.out.println("Searcher Finished...");
ds.close();
}
}
測試
先啟動提供端,再啟動搜尋端,不然提供端接收不到資訊。
提供端輸出:
Provider Started...
Provider receive form ip:192.168.43.214 port:49164 data:Hello World
Provider Finished...
Searcher Started...
Searcher receive form ip:192.168.43.214 port:2000 data:Receive data with len:11
Searcher Finished...