去网络听众关闭和例行处理

时间:2015-05-20 17:22:56

标签: http go proxy goroutine

我正在启动一个例程并在网络侦听器(HTTP)上进行侦听。我想关闭监听器,关闭例程并启动一个新例程,然后重新启动监听器。当我关闭听众时,一切都会崩溃。

listener是全球性的)

listener, _ = net.Listen(CONN_TYPE, CONN_HOST+":"+CONN_PORT)
go PassThrough()

,其中

func PassThrough() {
    verbose := flag.Bool("v", false, "should every proxy request be logged to stdout")
    flag.Parse()
    proxy := goproxy.NewProxyHttpServer()
    proxy.Verbose = *verbose
    log.Fatal(http.Serve(listener, proxy))
}

所以这可以工作,但是如果我想停止passThrough()并重新将侦听器应用于另一个任务(例如一个不同的代理“job”),那么用listener.Close()关闭监听器会导致它被破坏试着重新聆听并召唤一个新的例程。

我收到错误:

ProxyControllers.go:146: accept tcp 127.0.0.1:8080: use of closed network connection
reverseproxy.go:141: http: proxy error: EOF

然后我尝试重用Listener。

我想当我关闭()听众时,我需要告诉例程以某种方式关闭自己?

我正在使用goproxy

1 个答案:

答案 0 :(得分:1)

  1. 标志只应解析一次,可能只在init func。
  2. 中解析
  3. 您无法重复使用听众,您必须再次致电Listen
  4. 请勿致电log.Fatal,这将终止您的计划。
  5. 示例:

    var verbose = flag.Bool("v", false, "should every proxy request be logged to stdout")
    
    func runProxy(typ, host, port string) (listener tcp.Listener) {
        listener, _ = net.Listen(typ, host+":"+port)
        proxy := goproxy.NewProxyHttpServer()
        proxy.Verbose = *verbose
    
        go http.Serve(listener, proxy) // you can probably ignore this error
        return
    }
    
    func main() {
        flag.Parse()
        l := runProxy(....)
        //do something
        l.Close()
        l = runProxy(....)
        //....
    }