最近看到一些资料,提到了在同一台机器上进程间通讯的方式:unix 套接字。起初我还以为是 Socket 接口,因为用到了变量 SocketPath。后面经过 AI 助理翻译,才知道原来这是我的知识盲区了。
现在赶紧把这块知识补充上。
Unix 套接字(Unix domain sockets)是一种用于同一主机上进程间通信(IPC,Inter-Process Communication)的机制。与网络套接字不同,Unix 套接字不使用网络协议栈,因此性能更高。它们主要用于需要高效、低延迟的本地进程通信场景。
Unix 套接字是一种高效、可靠的本地进程间通信机制,适用于需要低延迟和高性能的应用场景。它们通过文件系统路径进行标识和通信,使用方便且配置简单,是本地主机上进程通信的重要工具。
下面来用 Go 语言实现一个基于 unix 的服务端和客户端,并且模拟进行进程间的通讯。下期我们将会用 Java&Groovy 重新实现一遍。同时测试一下夸语音 unix 套接字进程间通讯。
// TestServer 测试服务端
//
// @Description: 测试服务端
// @param t
func TestServer(t *testing.T) {
if _, err := os.Stat(socketPath); err == nil {
os.Remove(socketPath) // 如果文件存在,删除文件
}
listener, err := net.Listen("unix", socketPath) // 监听,创建一个unix socket
if err != nil {
fmt.Println("监听发生异常:", err)
return
}
defer listener.Close() // 关闭监听
fmt.Println("服务启动...")
for { // 循环
conn, err := listener.Accept() // 接收连接
if err != nil {
fmt.Println("接受信息错误:", err)
return
}
go handleConnection(conn) // 处理连接
}
}
其中处理连接的方法内容如下:
// 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
}
fmt.Printf("收到消息: %s\n", string(buffer[:n])) // 打印接收到的数据
}
客户端代码比较简单,实现了发送消息的功能。
// TestClient 测试客户端
//
// @Description: 测试客户端
// @param t
func TestClient(t *testing.T) {
conn, err := net.Dial("unix", socketPath)
if err != nil {
fmt.Println("拨号发生错误:", err)
return
}
defer conn.Close()
message := "Hello FunTester"
_, err = conn.Write([]byte(message))
if err != nil {
fmt.Println("写入消息错误:", err)
return
}
}
经过多次发送消息,控制台打印信息如下:
服务启动...
收到消息: Hello FunTester
收到消息: Hello FunTester
收到消息: Hello FunTester
下期的 Java 和 Groovy 版本敬请期待!!!