我如何永远从 TCP 服务器接收数据

How I can receive data for ever from TCP server

我尝试创建 TCP 客户端以从 TCP 服务器接收数据, 但是服务器发送数据后,即使服务器发送很多数据,我也只收到一个数据,我想永远接收数据,我不知道我的问题是什么,

客户:

func main() {
    tcpAddr := "localhost:3333"
    conn, err := net.DialTimeout("tcp", tcpAddr, time.Second*7)
    if err != nil {
        log.Println(err)
    }
    defer conn.Close()
    // conn.Write([]byte("Hello World"))

    connBuf := bufio.NewReader(conn)
    for {
        bytes, err := connBuf.ReadBytes('\n')
        if err != nil {
            log.Println("Rrecv Error:", err)
        }

        if len(bytes) > 0 {
            fmt.Println(string(bytes))
        }
        time.Sleep(time.Second * 2)
    }
}

我正在按照此 example 创建 TCP 测试服务器

服务器:

// Handles incoming requests.
func handleRequest(conn net.Conn) {
    // Make a buffer to hold incoming data.
    buf := make([]byte, 1024)
    // Read the incoming connection into the buffer.
    _, err := conn.Read(buf)
    if err != nil {
        fmt.Println("Error reading:", err.Error())
    }
    fmt.Println(buf)
    // Send a response back to person contacting us.
    var msg string
    fmt.Scanln(&msg)
    conn.Write([]byte(msg))
    // Close the connection when you're done with it.
    conn.Close()
}

读取需要在连接的另一端进行写入

want to receive data forever

那么你必须永远发送数据。接收端有一个for循环,但发送端没有循环。服务器写入一次消息并关闭连接。

服务器希望从客户端获取消息,但客户端没有发送

    // conn.Write([]byte("Hello World"))

这应该向服务器提供 msg

    _, err := conn.Read(buf)

所以这两行不匹配。

客户端需要换行符,但服务器没有发送换行符

fmt.Scanln 期望将每个 空格分隔的 值放入相应的参数中。它不捕获空格。所以:

  1. 只有您在服务器标准输入中输入的第一个空格才会存储在 msg
  2. 换行符不会存储在msg

但是你的客户正在做

        bytes, err := connBuf.ReadBytes('\n')

\n永远不会到来。客户永远不会读完第一个 msg.

bufio.NewScanner would be a better way to collect data from stdin,因为您可能也想捕获空格。不要忘记将换行符附加到您发送的每一行文本中,因为客户需要它!

工作代码

我把这些改动汇总成一个working example on the playground。为了让它在这种情况下工作,我还必须进行一些其他更改。

  • 运行服务器和客户端在同一个进程
  • 硬编码 3 个客户端,因此程序在有限的时间内结束
  • 硬编码 10 在客户端接收所以程序可以结束
  • 已处理硬编码 3 个服务器连接,因此程序可以结束
  • 删除了 fmt.Scanln 并让服务器 return 发送原始消息(因为 playground 不提供标准输入机制)

应该足以让您入门。