我尝试创建 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
期望将每个空格分隔的值放入相应的参数中。它不捕获空格。所以:
只有您在服务器标准输入中输入的第一个空格才会存储在
msg
换行符不会存储在
msg
.
但是你的客户正在做
bytes, err := connBuf.ReadBytes('\n')
\n
永远不会来。客户永远不会先读完那篇文章msg
。
bufio.NewScanner
将是从 stdin 收集数据的更好方法,因为您可能也想捕获空格。不要忘记将换行符附加到您发送的每一行文本,因为客户需要它!
工作代码
我将这些更改放在操场上的一个工作示例中。为了让它在这种情况下工作,我还必须进行一些其他更改。
在同一进程中运行服务器和客户端
硬编码 3 个客户端,因此程序在有限的时间内结束
硬编码 10 在客户端接收所以程序可以结束
处理了硬编码的 3 个服务器连接,以便程序可以结束
删除
fmt.Scanln
并让服务器返回发送的原始消息(因为游乐场不提供标准输入机制)
应该足以让你开始。
- 1 回答
- 0 关注
- 84 浏览
添加回答
举报
0/150
提交
取消