我试图使一个简单的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)
- }
- }