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

我如何永远从 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贡献1778条经验 获得超5个赞

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

想永远接收数据

然后你必须永远发送数据。接收端有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

添加回答

举报

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