简单的服务器客户端通信不起作用

Simple server client communication not working

这个看似简单的例子并没有按预期工作,我不好意思问这个问题,但这里是:

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

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()
}

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

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

表明没有数据交换,客户端没有阻塞。

客户端循环很奇怪! 如果 read/write 结束,循环就没有意义了。 但是错误只有这个:

  //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()
}