multithreading - 在 TCP 客户端服务器中循环读取和写入数据时的并发问题

标签 multithreading go tcp network-programming

我试图创建一个客户端服务器模型来学习一些东西,我只是尝试在循环中从客户端向服务器发送(写入)数据,但效果不佳。我认为存在一些并发问题,客户端写入服务器和服务器的速度比一次读取多个语句要快。如何保持这种并发性,以便服务器一次只读取客户端编写的一条语句。这是更好地说明问题的代码。

这里是服务器的 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()
}

这是服务器的输出。
![This is the Server output ] 1

最佳答案

这不是并发问题。这是一个网络问题。

TCP 是 协议(protocol),因此,单个 read()来自套接字的不对应于单个 write()从另一边。

相反,读取返回读取时 TCP 缓冲区中的任何内容,无论它是否是通过对 write() 的单个调用发送的。或一百。

如果您想从套接字读取数据作为单独的消息,您需要一种通过使用分隔符、计数字节或其他方法来分隔它们的方法。

关于multithreading - 在 TCP 客户端服务器中循环读取和写入数据时的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58606572/

相关文章:

linux - 在 Linux 中,模拟缓慢的流量传入流量到端口,例如54000

连接网络上的计算机

在循环中创建线程

c# - 从另一个线程关闭表单

go - 转到股票行情示例未选择 'done'情况?

mysql - 获取结果列表并在一个查询中获取总数

c# - 并行编程 TPL

multithreading - SQLite:跨线程共享连接读写

unit-testing - 测试以检查功能是否未运行?

c# - 需要 C# 服务器/客户端样式程序的帮助