Unix 套接字进程通信初探【Java 版本】
作者:FunTester
- 2024-06-03 河北
本文字数:2001 字
阅读完需:约 7 分钟
前文提到了 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])) // 打印接收到的数据 }
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 4
版权声明: 本文为 InfoQ 作者【FunTester】的原创文章。
原文链接:【http://xie.infoq.cn/article/1740007de8c9c77aa47193665】。文章转载请联系作者。
FunTester
关注
公众号:FunTester,800篇原创,欢迎关注 2020-10-20 加入
Fun·BUG挖掘机·性能征服者·头顶锅盖·Tester







评论