我试图创建一个客户端服务器模型来学习一些东西,我只是尝试在循环中从客户端向服务器发送(写入)数据,但效果不佳。我认为存在一些并发问题,客户端写入服务器和服务器的速度比一次读取多个语句要快。如何保持这种并发性,以便服务器一次只读取客户端编写的一条语句。这是更好地说明问题的代码。
这里是服务器的 handleConnection 函数
func main() {
conn, err := net.Listen("tcp", ":8080")
if err != nil {
log.Println("Error:", err)
}
for {
ln, err := conn.Accept()
if err != nil {
log.Println("Error:", err)
continue
}
go handleConnection(ln)
}
}
func handleConnection(conn net.Conn) {
buffer := make([]byte, 4096)
for i := 0; i < 10; i++ {
n, err := conn.Read(buffer)
if err != nil {
fmt.Println(err, i)
}
fmt.Printf("%s\n", buffer[:n])
}
fmt.Println("Done")
conn.Close()
}
这是客户端循环向服务器写入数据。
func main() {
conn, err := net.Dial("tcp", ":8080")
if err != nil {
log.Println("Error:", err)
os.Exit(1)
}
for i := 0; i < 10; i++ {
_, err = conn.Write([]byte("Rehan"))
if err != nil {
fmt.Println(err, i)
}
}
fmt.Println("Done")
conn.Close()
}
这是服务器的输出。
] 1
最佳答案
这不是并发问题。这是一个网络问题。
TCP 是 流协议(protocol),因此,单个 read()
来自套接字的不对应于单个 write()
从另一边。
相反,读取返回读取时 TCP 缓冲区中的任何内容,无论它是否是通过对 write()
的单个调用发送的。或一百。
如果您想从套接字读取数据作为单独的消息,您需要一种通过使用分隔符、计数字节或其他方法来分隔它们的方法。
关于multithreading - 在 TCP 客户端服务器中循环读取和写入数据时的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58606572/