我试图使一个简单的echo客户端和服务器使用Unix套接字。在这个例子中,连接似乎是单向的。服务器可以从客户端接收数据,但不能发回数据。如果我使用tcp连接,它的效果很好。有人知道有什么问题吗?
服务器
package main import "net" import "fmt" func echoServer(c net.Conn) { for { buf := make([]byte,512) nr,err := c.Read(buf) if err != nil { return } data := buf[0:nr] fmt.Printf("Received: %v",string(data)) _,err = c.Write(data) if err != nil { panic("Write: " + err.String()) } } } func main() { l,err := net.Listen("unix","/tmp/echo.sock") if err != nil { println("listen error",err.String()) return } for { fd,err := l.Accept() if err != nil { println("accept error",err.String()) return } go echoServer(fd) } }
客户
package main import "net" import "time" func main() { c,err := net.Dial("unix","","/tmp/echo.sock") if err != nil { panic(err.String()) } for { _,err := c.Write([]byte("hi\n")) if err != nil { println(err.String()) } time.Sleep(1e9) } }
在您的示例客户端中,您似乎没有从服务器读取结果。当我添加代码来做到这一点,我看到服务器的结果。
另外,看看我如何使用延迟和休息使读者goroutine退出。
服务器
package main import ( "log" "net" ) func echoServer(c net.Conn) { for { buf := make([]byte,err := c.Read(buf) if err != nil { return } data := buf[0:nr] println("Server got:",err = c.Write(data) if err != nil { log.Fatal("Write: ",err) } } } func main() { l,"/tmp/echo.sock") if err != nil { log.Fatal("listen error:",err) } for { fd,err := l.Accept() if err != nil { log.Fatal("accept error:",err) } go echoServer(fd) } }
客户
package main import ( "io" "log" "net" "time" ) func reader(r io.Reader) { buf := make([]byte,1024) for { n,err := r.Read(buf[:]) if err != nil { return } println("Client got:",string(buf[0:n])) } } func main() { c,"/tmp/echo.sock") if err != nil { panic(err) } defer c.Close() go reader(c) for { _,err := c.Write([]byte("hi")) if err != nil { log.Fatal("write error:",err) break } time.Sleep(1e9) } }