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

我尝试创建 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)

    }

}

我按照这个例子来创建 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()

}


梵蒂冈之花
浏览 90回答 1
1回答

阿晨1998

读取需要在连接的另一端进行写入想永远接收数据然后你必须永远发送数据。接收端有for环路,发送端没有环路。服务器写入一次消息并关闭连接。服务器希望从客户端获取消息,但客户端不发送    // conn.Write([]byte("Hello World"))那应该为msg服务器提供价值    _, err := conn.Read(buf)所以这两行不匹配。客户端需要一个换行符,但服务器没有发送一个fmt.Scanln期望将每个空格分隔的值放入相应的参数中。它不捕获空格。所以:只有您在服务器标准输入中输入的第一个空格才会存储在msg换行符不会存储在msg.但是你的客户正在做        bytes, err := connBuf.ReadBytes('\n')\n永远不会来。客户永远不会先读完那篇文章msg。bufio.NewScanner将是从 stdin 收集数据的更好方法,因为您可能也想捕获空格。不要忘记将换行符附加到您发送的每一行文本,因为客户需要它!工作代码我将这些更改放在操场上的一个工作示例中。为了让它在这种情况下工作,我还必须进行一些其他更改。在同一进程中运行服务器和客户端硬编码 3 个客户端,因此程序在有限的时间内结束硬编码 10 在客户端接收所以程序可以结束处理了硬编码的 3 个服务器连接,以便程序可以结束删除fmt.Scanln并让服务器返回发送的原始消息(因为游乐场不提供标准输入机制)应该足以让你开始。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go