为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
梵蒂冈之花 2022-11-23 16:07:17
我尝试创建 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()}
查看完整描述

1 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

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

想永远接收数据

然后你必须永远发送数据。接收端有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将是从 stdin 收集数据的更好方法,因为您可能也想捕获空格。不要忘记将换行符附加到您发送的每一行文本,因为客户需要它!

工作代码

我将这些更改放在操场上的一个工作示例中。为了让它在这种情况下工作,我还必须进行一些其他更改。

  • 在同一进程中运行服务器和客户端

  • 硬编码 3 个客户端,因此程序在有限的时间内结束

  • 硬编码 10 在客户端接收所以程序可以结束

  • 处理了硬编码的 3 个服务器连接,以便程序可以结束

  • 删除fmt.Scanln并让服务器返回发送的原始消息(因为游乐场不提供标准输入机制)

应该足以让你开始。


查看完整回答
反对 回复 2022-11-23
  • 1 回答
  • 0 关注
  • 84 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信