「原創宣告:保留所有權利,禁止轉載」
前文提到了 Go 語言版本的 Unix 套接字的實踐,作為 Java 選手,自然也必須安排上。有了 Go 的經驗,Java 寫起來也比較容易。
Java 使用 Unix 套接字並不是 JDK 自帶的,我們需要引入一個依賴。
<dependency>
<groupId>com.kohlschutter.junixsocket</groupId>
<artifactId>junixsocket-core</artifactId>
<version>2.3.3</version>
</dependency>
Java 實現
相比 Go 語言,Java 的程式碼略顯臃腫了。但對於我來講,Java 語言熟悉太多了,跟見了親人似的。
服務端
服務端跟前文功能一致,啟動服務,接收訊息,回覆訊息。
package com.funtest.unix_socket;
import org.newsclub.net.unix.AFUNIXServerSocket;
import org.newsclub.net.unix.AFUNIXSocketAddress;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Unix Socket 服務端
*/
public class UnixSocketServer {
public static void main(String[] args) throws IOException {
File socketFile = new File("/Users/oker/logs/temp/unix_socket_example");// 服務端監聽的檔案
try (ServerSocket server = AFUNIXServerSocket.newInstance()) {// 建立服務端
server.bind(new AFUNIXSocketAddress(socketFile));// 繫結檔案
System.out.println("監聽檔案: " + socketFile);
while (true) {
try (Socket socket = server.accept()) {// 接收客戶端連線
try (BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 讀取客戶端訊息
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true)) {// 回覆客戶端訊息
String line;
while ((line = reader.readLine()) != null) {// 迴圈讀取客戶端訊息
System.out.println("收到訊息: " + line);
writer.println("回覆: " + line);// 回覆訊息
}
}
}
}
}
}
}
客戶端
下面是客戶端程式碼,只是傳送訊息,列印響應。
package com.funtest.unix_socket;
import org.newsclub.net.unix.AFUNIXSocket;
import org.newsclub.net.unix.AFUNIXSocketAddress;
import java.io.*;
import java.net.Socket;
/**
* Unix Socket 客戶端
*/
public class UnixScoketClient {
public static void main(String[] args) throws IOException {
File socketFile = new File("/Users/oker/logs/temp/unix_socket_example");// 服務端監聽的檔案
try (Socket socket = AFUNIXSocket.newInstance()) {// 建立客戶端
socket.connect(new AFUNIXSocketAddress(socketFile));// 連線服務端
try (BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 讀取服務端訊息
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true)) {// 傳送訊息給服務端
writer.println("Hello FunTester");
String response = reader.readLine();// 讀取服務端響應
System.out.println("收到響應: " + response);
}
}
}
}
測試互聯
經過幾次客戶端傳送訊息,下面是服務端列印:
監聽檔案: /Users/oker/logs/temp/unix_socket_example
收到訊息: Hello FunTester
收到訊息: Hello FunTester
收到訊息: Hello FunTester
下面是客戶端列印:
收到響應: 回覆: Hello FunTester
程序已結束,退出程式碼為 0
下面我用 Go 語言的服務端進行測試,Go 服務端列印:
=== RUN TestServer
服務啟動...
收到訊息: Hello FunTester
Java 客戶端列印:
收到響應: null
程序已結束,退出程式碼為 0
因為原版的 Go 服務端並沒有返回響應,現在加上一行程式碼,增加訊息返回。
// handleConnection 處理連線
//
// @Description: 處理連線
// @param conn
func handleConnection(conn net.Conn) {
defer conn.Close() // 關閉連線
buffer := make([]byte, 1024) // 建立一個緩衝區
n, err := conn.Read(buffer) // 讀取資料
if err != nil { // 如果讀取錯誤
fmt.Println("讀取錯誤:", err)
return
}
conn.Write([]byte("Hello FunTester")) // 寫入資料
fmt.Printf("收到訊息: %s\n", string(buffer[:n])) // 列印接收到的資料
}
- 2021 年原創合集
- 2022 年原創合集
- 2023 年原創合集
- 服務端功能測試
- 效能測試專題
- Java、Groovy、Go、Python
- 單元&白盒&工具合集
- 測試方案&BUG&爬蟲&UI 自動化
- 測試理論雞湯
- 社群風采&影片合集
如果覺得我的文章對您有用,請隨意打賞。您的支援將鼓勵我繼續創作!
打賞支援
暫無回覆。