我正在尝试使用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脚本的请求和响应是正确的?
答案 0 :(得分:1)
这就像kouton一样自我回答,但使用单一的&#34;后端&#34;连接(在本地服务器和远程服务器之间)以服务多个&#34;前端&#34;连接(在本地PHP和本地服务器之间)是多路复用的一种形式,muxado包(video of a talk)旨在帮助您实现它。