登录
首页 >  Golang >  Go问答

Golang TCP服务器 - 实现客户端之间的数据交流

来源:stackoverflow

时间:2024-03-27 19:24:26 219浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《Golang TCP服务器 - 实现客户端之间的数据交流》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

我正在寻找在 go 中实现一个 tcp 服务器,它应该能够从一个客户端接收数据并将其发送到另一个客户端。实现这一目标的正确方法是什么?我尝试了以下代码:

astSrc := *addr + ":" + strconv.Itoa(*astPort)
astListener, _ := net.Listen("tcp", astSrc)
fmt.Printf("Listening on %s for Client Connections.\n", astSrc)

defer astListener.Close()

pmsSrc := *addr + ":" + strconv.Itoa(*pmsPort)
pmsListener, _ := net.Listen("tcp", pmsSrc)
fmt.Printf("Listening on %s for DB Connections.\n", pmsSrc)

defer pmsListener.Close()

for {
pmsConn, pmsErr := pmsListener.Accept()

if pmsErr != nil {
    fmt.Printf("Some connection error: %s\n", pmsErr)
}

go handlePMSConnection(pmsConn)

astConn, astErr := astListener.Accept()

if astErr != nil {
    fmt.Printf("Some connection error: %s\n", astErr)
}
go handleAstConnection(astConn, pmsConn)
}

我想为每个客户端使用 2 个不同的端口(astsrc - 这是短时间连接,pmssrc - 永久连接)并为每个客户端创建 2 个侦听器。我希望能够从连接到 astsrc 端口的 client-1 接收消息,并将其传递到 client-2(pmssrc 端口)。到目前为止,此代码可以正常工作,但如果 client-1 断开连接然后又连接回来 - 服务器将不再接受任何消息。我不知道在同一循环中处理两个连接是否正确,我认为这就是问题所在,但如果我从循环中取出一个连接,那么该连接将无法访问。你能指出我正确的方向吗?


解决方案


问题似乎是您获得的每个 ast 连接都需要一个 pms 连接,在循环中插入您的 ast 连接的接受可能会解决您眼前的问题,就像这样

for {
    pmsConn, pmsErr := pmsListener.Accept()

    if pmsErr != nil {
        fmt.Printf("Some connection error: %s\n", pmsErr)
    }

    go handlePMSConnection(pmsConn)
    for {
        astConn, astErr := astListener.Accept()

        if astErr != nil {
            fmt.Printf("Some connection error: %s\n", astErr)
        }
        go handleAstConnection(astConn, pmsConn)
    }
}

但是如果你失去了 pms 连接就会出现问题,如果你获得多个 ast 连接会发生什么。并且您需要在 ast 连接之前连接 pms 连接。

好了,本文到此结束,带大家了解了《Golang TCP服务器 - 实现客户端之间的数据交流》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>