
本文介绍了如何在Go语言中使用Unix Socket构建一个简单的回声客户端和服务器。通过示例代码详细展示了服务器如何监听Unix Socket,接收客户端数据并原样返回,以及客户端如何连接服务器并读取返回的数据。同时,强调了客户端需要读取服务器响应的重要性,并提供了完整的、可运行的示例代码,帮助开发者快速上手Unix Socket编程。
Unix Socket是同一主机上进程间通信(IPC)的一种方式,相比于TCP Socket,它避免了网络协议栈的开销,因此效率更高。在Go语言中,可以使用net包来操作Unix Socket。下面我们将分别展示服务器端和客户端的实现。
服务器端的主要职责是监听指定的Unix Socket文件,接受客户端连接,并创建一个goroutine来处理每个连接。在处理连接的goroutine中,服务器读取客户端发送的数据,然后将数据原样写回客户端。
package main
import (
"log"
"net"
)
func echoServer(c net.Conn) {
defer c.Close() // 确保连接关闭
for {
buf := make([]byte, 512)
nr, err := c.Read(buf)
if err != nil {
// 连接关闭或发生错误时退出循环
log.Println("Connection closed or read error:", err)
return
}
data := buf[:nr]
log.Printf("Server received: %s\n", string(data))
nw, err := c.Write(data)
if err != nil {
log.Println("Write error:", err)
return
}
if nw != nr {
log.Println("Write incomplete")
return
}
}
}
func main() {
socketPath := "/tmp/echo.sock"
l, err := net.Listen("unix", socketPath)
if err != nil {
log.Fatal("Listen error:", err)
}
defer l.Close() // 确保listener关闭
log.Println("Server listening on", socketPath)
for {
fd, err := l.Accept()
if err != nil {
log.Println("Accept error:", err)
continue // 继续监听其他连接
}
log.Println("Accepted connection from", fd.RemoteAddr())
go echoServer(fd)
}
}代码解释:
立即学习“go语言免费学习笔记(深入)”;
客户端需要连接到服务器监听的Unix Socket文件,然后发送数据,并读取服务器返回的数据。
package main
import (
"bufio"
"fmt"
"io"
"log"
"net"
"os"
"time"
)
func reader(r io.Reader) {
buf := bufio.NewReader(r)
for {
line, err := buf.ReadString('\n')
if err != nil {
// 连接关闭或发生错误时退出循环
log.Println("Connection closed or read error:", err)
return
}
fmt.Printf("Client received: %s", line)
}
}
func main() {
socketPath := "/tmp/echo.sock"
c, err := net.Dial("unix", socketPath)
if err != nil {
log.Fatalf("Dial error: %v", err)
os.Exit(1) // 退出程序
}
defer c.Close()
log.Println("Connected to server")
go reader(c)
for {
message := "hi\n" // 添加换行符
_, err := c.Write([]byte(message))
if err != nil {
log.Println("Write error:", err)
break
}
log.Println("Client sent:", message)
time.Sleep(time.Second)
}
}代码解释:
立即学习“go语言免费学习笔记(深入)”;
注意事项:
总结:
通过本文的示例代码,我们了解了如何在Go语言中使用Unix Socket构建一个简单的回声客户端和服务器。Unix Socket是一种高效的进程间通信方式,在需要高性能的本地通信场景中非常有用。掌握Unix Socket编程,可以帮助我们构建更高效、更可靠的应用程序。
以上就是Go语言中使用Unix Socket实现回声服务的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号