Unix 套接字程序通訊初探【Java 版本】

FunTester發表於2024-06-03

前文提到了 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 自動化
  • 測試理論雞湯
  • 社群風采&影片合集
如果覺得我的文章對您有用,請隨意打賞。您的支援將鼓勵我繼續創作!
打賞支援
暫無回覆。

相關文章