我如何永远从 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
期望将每个 空格分隔的 值放入相应的参数中。它不捕获空格。所以:
- 只有您在服务器标准输入中输入的第一个空格才会存储在
msg
中
- 换行符不会存储在
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 不提供标准输入机制)
应该足以让您入门。
我尝试创建 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
期望将每个 空格分隔的 值放入相应的参数中。它不捕获空格。所以:
- 只有您在服务器标准输入中输入的第一个空格才会存储在
msg
中
- 换行符不会存储在
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 不提供标准输入机制)
应该足以让您入门。