Sockets 服务器未在";中获取消息;“你好,世界”;套接字程序
我正在练习与bufio一起使用Unix套接字。以下是节目:Sockets 服务器未在";中获取消息;“你好,世界”;套接字程序,sockets,unix,go,Sockets,Unix,Go,我正在练习与bufio一起使用Unix套接字。以下是节目: // Register server socket os.Remove("serversock") socket, err := net.ListenUnix("unix", &net.UnixAddr{"serversock", "unix"}) if err != nil { panic(err) } go func() { for {
// Register server socket
os.Remove("serversock")
socket, err := net.ListenUnix("unix", &net.UnixAddr{"serversock", "unix"})
if err != nil {
panic(err)
}
go func() {
for {
// Accept new connection
conn, err := socket.Accept()
if err != nil {
panic(err)
}
fmt.Println("Got connection")
reader := bufio.NewReader(conn)
line, err := reader.ReadString(byte('\n'))
if err != nil {
panic(err)
}
fmt.Println("Got line", line)
}
}()
// Client connection
conn, err := net.DialUnix("unix", nil, &net.UnixAddr{"serversock", "unix"})
writer := bufio.NewWriter(conn)
n, err := writer.WriteString("hello world\n")
if err != nil {
panic(err)
}
fmt.Println("Written", n)
// Client wait
time.Sleep(1 * time.Second)
当它运行时,它会打印:
Written 13
Got connection
然后存在,因此服务器似乎无法获取消息。我做错了什么?您的写入程序已被缓冲,当您
WriteString()
写入时,它不会刷新缓冲区。只需调用writer.Flush()
,它就会实际发送该行。您还可以尝试直接写入套接字,看看会发生什么
此外,您的accept循环应该如下所示:
go func() {
for {
// Accept new connection
conn, err := socket.Accept()
if err != nil {
panic(err)
}
fmt.Println("Got connection")
reader := bufio.NewReader(conn)
//spawn a goroutine that has a read loop
go func(reader *bufio.Reader) {
for {
line, err := reader.ReadString(byte('\n'))
if err != nil {
panic(err)
}
fmt.Println("Got line", line)
}
}(reader)
}
}()