【问题标题】:Simple server client communication not working简单的服务器客户端通信不起作用
【发布时间】:2019-09-02 05:36:47
【问题描述】:

这个看似简单的例子没有按预期工作,我觉得问起来很糟糕,但这里是:

有一个客户端重试连接服务器,发送消息,然后等待响应:

func client() {
    var conn net.Conn
    var err error

    // retry server until it is up
    for {
        conn, err = net.Dial("tcp", ":8081")
        if err == nil {
            break
        }
        log.Println(err)
        time.Sleep(time.Second)
    }

    // write to server
    _, err = conn.Write([]byte("request"))
    if err != nil {
        log.Println(err)
        return
    }

    // block & read from server
    var buf []byte
    n, err := conn.Read(buf)
    if err != nil {
        log.Println(err)
        return
    }
    log.Printf("From server: %s\n", buf[:n])
}

它连接到一个服务器,对于每个连接,读取和解释发送的数据,并在需要时发送响应:

func server() {
    ln, _ := net.Listen("tcp", ":8081")
    for {
        conn, _ := ln.Accept()
        go handleConn(conn)
    }
}

func handleConn(conn net.Conn) {
    var buf []byte
    n, err := conn.Read(buf)
    if err != nil {
        return
    }
    log.Printf("Server got: %s\n", buf)

    if string(buf[:n]) == "request" {
        _, _ = conn.Write([]byte("response"))
    }
}

全部由main函数驱动:

func main() {
    go client()
    server()
}

为简洁起见,省略了错误处理。预期的行为是客户端将连接到服务器并发送消息“请求”,然后阻止读取。服务器接收“请求”并将消息“响应”发送回同一连接。客户端解除阻塞,打印收到的消息并退出。相反,当程序运行时,会打印以下内容:

2019/09/01 22:24:02 From server: 
2019/09/01 22:24:02 Server got: 

提示没有数据交换,客户端没有阻塞。

【问题讨论】:

    标签: go networking client-server


    【解决方案1】:

    客户端的循环很奇怪! 如果读/写失败,则循环没有意义。 但错误只是这样:

      //var buf []byte <--- this read 0 bytes
      buf := make([]byte, 1024) 
      n, err := conn.Read(buf)
    

    给你的建议:

    package main
    
    import (
        "log"
        "net"
        "time"
    )
    
    func client() {
        var conn net.Conn
        var err error
    
        // retry server until it is up
        for {
            log.Printf("Connecting...")
            conn, err = net.Dial("tcp", ":8082")
            if err != nil {
                log.Println(err)
                break
            }
            time.Sleep(time.Second)
            // write to server
            log.Printf("Writing...")
            _, err = conn.Write([]byte("request"))
            if err != nil {
                log.Println(err)
                return
            }
            // block & read from server
            log.Printf("Reading...")
            var buf []byte
            n, err := conn.Read(buf)
            if err != nil {
                log.Println(err)
                return
            }
            log.Printf("From server: %s\n", buf[:n])
        }
    }
    
    func server() {
        ln, _ := net.Listen("tcp", ":8082")
        for {
            conn, _ := ln.Accept()
            go handleConn(conn)
        }
    }
    
    func handleConn(conn net.Conn) {
        buf := make([]byte, 1024)
        n, err := conn.Read(buf)
        if err != nil {
            return
        }
        log.Printf("Server got: [%d bytes] %s\n", n, buf)
    
        if string(buf[:n]) == "request" {
            _, _ = conn.Write([]byte("response"))
        }
        conn.Close()
    }
    
    func main() {
        go client()
        server()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 2016-05-14
      相关资源
      最近更新 更多