UDP 服務(wù)端
package network;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpEchoServer {
private DatagramSocket socket = null;
// 參數(shù)是服務(wù)器要綁定的端口號(hào)
public UdpEchoServer(int port) throws SocketException {
socket = new DatagramSocket(port);
}
// 使用此方法啟動(dòng)服務(wù)器
public void start() throws IOException {
System.out.println("服務(wù)器啟動(dòng)!");
while (true) {
// 反復(fù)的, 長(zhǎng)期的執(zhí)行針對(duì)客戶端請(qǐng)求處理的邏輯.
// 一個(gè)服務(wù)器, 運(yùn)行過程中, 要做的事情, 主要是三個(gè)核心環(huán)節(jié).
// 1. 讀取請(qǐng)求, 并解析
DatagramPacket requestPacket = new DatagramPacket(new byte[4096], 4096);
socket.receive(requestPacket);
// 這樣的轉(zhuǎn)字符串的前提是, 后續(xù)客戶端發(fā)的數(shù)據(jù)就是一個(gè)文本的字符串.
String request = new String(requestPacket.getData(), 0, requestPacket.getLength());
// 2. 根據(jù)請(qǐng)求, 計(jì)算出響應(yīng)
String response = process(request);
// 3. 把響應(yīng)寫回給客戶端
// 此時(shí)需要告知網(wǎng)卡, 要發(fā)的內(nèi)容是啥, 要發(fā)給誰(shuí).
DatagramPacket responsePacket = new DatagramPacket(response.getBytes(), response.getBytes().length,
requestPacket.getSocketAddress());
socket.send(responsePacket);
// 記錄日志, 方便觀察程序執(zhí)行效果.
System.out.printf("[%s:%d] req: %s, resp: %s\n", requestPacket.getAddress().toString(), requestPacket.getPort(),
request, response);
}
}
public String process(String request) {
return request;
}
public static void main(String[] args) throws IOException {
UdpEchoServer server = new UdpEchoServer(9090);
server.start();
}
}
UDP 客戶端
package network;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
// UDP 的回顯服務(wù)器
// 客服端發(fā)的請(qǐng)求是什么, 服務(wù)器返回的響應(yīng)就是什么
public class UdpEchoClient {
private DatagramSocket socket = null;
private String serverIp;
private int serverPort;
public UdpEchoClient(String ip, int port) throws SocketException {
this.serverIp = ip;
this.serverPort = port;
socket = new DatagramSocket();
}
// 讓這個(gè)客戶端反復(fù)的從控制臺(tái)讀取用戶輸入的內(nèi)容.
// 把這個(gè)內(nèi)容構(gòu)造成 UDP 請(qǐng)求, 發(fā)給服務(wù)器. 再讀取服務(wù)器返回的 UDP 響應(yīng)
// 最終再顯示在客戶端的屏幕上.
public void start() throws IOException {
Scanner scanner = new Scanner(System.in);
System.out.println("客戶端啟動(dòng)!");
while (true) {
// 1. 從控制臺(tái)讀取用戶輸入的內(nèi)容
System.out.print("-> "); // 命令提示符, 提示用戶要輸入字符串.
String request = scanner.next();
// 2. 構(gòu)造請(qǐng)求對(duì)象, 并發(fā)給服務(wù)器.
DatagramPacket requestPacket = new DatagramPacket(request.getBytes(), request.getBytes().length,
InetAddress.getByName(serverIp), serverPort);
socket.send(requestPacket);
// 3. 讀取服務(wù)器的響應(yīng), 并解析出響應(yīng)內(nèi)容.
DatagramPacket responsePacket = new DatagramPacket(new byte[4096], 4096);
socket.receive(responsePacket);
String response = new String(responsePacket.getData(), 0, responsePacket.getLength());
// 4. 顯示到屏幕上.
System.out.println(response);
}
}
public static void main(String[] args) throws IOException {
UdpEchoClient client = new UdpEchoClient("127.0.0.1", 9090);
client.start();
}
}
實(shí)現(xiàn)效果
UDP 服務(wù)端(實(shí)現(xiàn)字典功能)
只需要繼承自之前寫的服務(wù)端, 然后重寫父類 process 方法即可. 添加一些查詢字典的邏輯.
package network;
import java.io.IOException;
import java.net.SocketException;
import java.util.HashMap;
import java.util.Map;
public class UdpDictServer extends UdpEchoServer {
private Map<String, String> dict = new HashMap<>();
public UdpDictServer(int port) throws SocketException {
super(port);
dict.put("cat", "小貓");
dict.put("dog", "小狗");
dict.put("hello", "你好");
}
@Override
public String process(String request) {
return dict.getOrDefault(request, "該詞沒有查詢到!");
}
public static void main(String[] args) throws IOException {
UdpDictServer server = new UdpDictServer(9090);
server.start();
}
}
效果
總結(jié)
? 本文記錄了一個(gè)簡(jiǎn)單的 UDP 回顯服務(wù)器代碼.
? 想了解更多計(jì)算機(jī)網(wǎng)絡(luò)的知識(shí), 可以收藏一下本人的計(jì)算機(jī)網(wǎng)絡(luò)學(xué)習(xí)專欄, 里面會(huì)持續(xù)更新本人的學(xué)習(xí)記錄, 跟隨我一起不斷學(xué)習(xí).
? 感謝你們的耐心閱讀, 博主本人也是一名學(xué)生, 也還有需要很多學(xué)習(xí)的東西. 寫這篇文章是以本人所學(xué)內(nèi)容為基礎(chǔ), 日后也會(huì)不斷更新自己的學(xué)習(xí)記錄, 我們一起努力進(jìn)步, 變得優(yōu)秀, 小小菜鳥, 也能有大大夢(mèng)想, 關(guān)注我, 一起學(xué)習(xí).文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-831794.html
再次感謝你們的閱讀, 你們的鼓勵(lì)是我創(chuàng)作的最大動(dòng)力!!!!!
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-831794.html
到了這里,關(guān)于Java 簡(jiǎn)單實(shí)現(xiàn)一個(gè) UDP 回顯服務(wù)器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!