我正在寻求实施一个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的连接,然后再将其连接回去,则服务器将不再接受任何消息。我不知道在同一个循环中处理两个连接是否正确,我认为这就是问题所在,但是如果我从循环中取出一个连接,则该连接将无法连接。您能指出我正确的方向吗?
答案 0 :(得分: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连接。