Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go I';我试图用net软件包构建一个简单的代理,但当我不&x27;不要使用围棋程序_Go_Goroutine - Fatal编程技术网

Go I';我试图用net软件包构建一个简单的代理,但当我不&x27;不要使用围棋程序

Go I';我试图用net软件包构建一个简单的代理,但当我不&x27;不要使用围棋程序,go,goroutine,Go,Goroutine,我用net包编写了这个简单的代理服务器,我希望它能够通过8000将8001本地服务器的连接代理到任何传入的连接。当我转到浏览器并尝试它时,会出现拒绝连接错误 主程序包 进口( “净额” “日志” “io” ) func main(){ l、 err:=net.Listen(“tcp”,“localhost:8000”) 如果错误!=零{ log.Fatal(错误) } 为了{ conn,err:=l.Accept() 如果错误!=零{ log.Fatal(错误) } go代理(康涅狄格州) }

我用
net
包编写了这个简单的代理服务器,我希望它能够通过8000将8001本地服务器的连接代理到任何传入的连接。当我转到浏览器并尝试它时,会出现拒绝连接错误

主程序包
进口(
“净额”
“日志”
“io”
)
func main(){
l、 err:=net.Listen(“tcp”,“localhost:8000”)
如果错误!=零{
log.Fatal(错误)
}
为了{
conn,err:=l.Accept()
如果错误!=零{
log.Fatal(错误)
}
go代理(康涅狄格州)
}
}
func代理(conn net.conn){
延迟连接关闭()
上游,err:=net.Dial(“tcp”,“本地主机:8001”)
如果错误!=零{
日志打印(错误)
返回
}
推迟上游。关闭()
io.副本(康涅狄格州上游)
io.副本(连接,上游)
}
但是如果我在代理函数中更改以下行

io.Copy(上游,康涅狄格州)
io.副本(连接,上游)

go io.Copy(上游,康涅狄格州)
io.副本(连接,上游)
然后它就如预期的那样工作了。
io.Copy(上游,康涅狄格州)
是否应该阻止
io.Copy(上游,康涅狄格州)
?根据我的理解,conn应该在上游回复后才编写?对于
io.Copy(上游,康涅狄格州)
part,有一个go例程如何解决这个问题

我不应该复制块吗

是的。由于这是一个网络连接,这意味着它会在客户端关闭连接后返回。客户端是否以及何时关闭连接取决于应用程序协议。例如,在HTTP中,它可能永远不会发生

goroutine如何解决这个问题

因为第二个副本可以在客户端仍然连接的情况下执行,从而允许上游写入其响应。如果没有goroutine,任何东西都不会从上游读取,因此它很可能在写调用时被阻塞


客户端(大概)等待响应,代理等待客户端关闭连接,上游等待代理开始读取响应:没有人可以取得进展,您处于死锁状态。

谢谢。我认为客户可能无法关闭连接的部分给了我所需的清晰度。对于第一部分,不使用goroutine阻止从上游到客户端的拷贝是有意义的。