【发布时间】:2014-12-23 04:03:31
【问题描述】:
我正在尝试使用 Go 在两台服务器之间建立持久的 TCP 连接;位于本地的client 和远程计算机中的server。客户端还在本地为PHP 脚本提供HTTP 请求。每个请求都通过 TCP 连接中继到远程服务器。然后将响应发送回 PHP 脚本。
HTTP request from .php script
\
\ -----> HTTP req is relayed
\
client <--------------TCP connection------------> server
/
/ <------ Response is relayed
/
HTTP request from .php script
对于并发连接,发送到远程服务器和从远程服务器返回的请求不同步,即请求 #1 的响应可以发送到请求 #2。
我目前的解决方案
我创建了一个map 频道,这些频道由每个 HTTP 请求的唯一 ID 标识。此唯一 ID 在 TCP 请求中传递给服务器,并与响应一起发回。客户端在响应中解析这个ID,并将其发送到数组中对应的通道。过于简化的代码,其中conns 是可用频道的map,唯一ID 是整个响应,或者str:
connbuf := bufio.NewReader(remoteConn)
str, err := connbuf.ReadString('\n')
str = strings.TrimSpace(str)
if len(str) > 0 {
id, _ := strconv.Atoi(str)
conns[id] <- str
}
问题
是否有更优雅的内置方式来实现这一点 - 即使并发请求也能确保对本地 PHP 脚本的请求和响应正确?
【问题讨论】:
-
考虑到将一堆请求多路复用到一个连接上的任务,那么,是的,您最终会遇到与您正在做的事情大致一样复杂的事情。
-
关于如何可靠地做到这一点的任何指针?实现这一点的任何最佳实践(在任何其他语言中也将有助于理解)?
-
使用您提到的
multiplexing关键字,我发现了这个:github.com/inconshreveable/muxado 和同一作者的hakkalabs.co/articles/stream-multiplexing-go 你认为这解决了这个@twotwotwo -
啊,太好了,我什至没想到评论会有很大帮助!是的,我只看过那个包,但它看起来确实是用于您在此处描述的那种任务;似乎值得尝试整合。
-
@twotwotwo 你能不能提供一个答案:)
标签: go