首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Golang Gorilla Websocket与Web代理

Golang Gorilla Websocket与Web代理
EN

Stack Overflow用户
提问于 2016-04-01 20:50:37
回答 1查看 4.8K关注 0票数 1

我正在开发一个POC,它使用Gorilla/Websocket通过网络代理与Websocket检查网站"echo.websocket.org“进行通信。

我使用免费的在线代理"hide.me/en/“进行测试。

当我简单地尝试与"echo.websocket.org“(服务器端)通信时,我的客户端站点Websocket POC会得到响应。

但是当我尝试添加代理手势时,一切都出错了:(

下面是我的代码示例:

代码语言:javascript
复制
package main

import (
    "flag"
    "log"
    "net/url"
    "os"
    "os/signal"
    "time"

    "github.com/gorilla/websocket"
    "net/http"
)

var addrWebsocket = flag.String("addrWebsocket", "echo.websocket.org", "http service address")

func main() {
    flag.Parse()
    log.SetFlags(0)

    interrupt := make(chan os.Signal, 1)
    signal.Notify(interrupt, os.Interrupt)

    //Initialize the WebSocket URL and the Path to follow
    uWS := url.URL{Scheme: "wss", Host: *addrWebsocket}

    //Initialize the Proxy URL and the Path to follow
    uProxy, _ := url.Parse("https://hide.me/en/proxy")

    //Set the Dialer (especially the proxy)
    dialer := websocket.Dialer{
        Proxy: http.ProxyURL(uProxy),
    }
    //dialer := websocket.DefaultDialer ==> with this default dialer, it works !

    c, _, err := dialer.Dial(uWS.String(), nil) // ==> With the proxy config, it fails here !
    defer c.Close()

    done := make(chan struct{})

    go func() {
        defer c.Close()
        defer close(done)
        for {
            _, message, err := c.ReadMessage()
            if err != nil {
                log.Println("read:", err)
                return
            }
            log.Printf("recv: %s", message)
        }
    }()

    ticker := time.NewTicker(time.Second)
    defer ticker.Stop()

    for {
        select {
        case t := <-ticker.C:
            err := c.WriteMessage(websocket.TextMessage, []byte(t.String()))
            if err != nil {
                log.Println("write:", err)
                return
            }
        case <-interrupt:
            log.Println("interrupt")
            err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
            if err != nil {
                log.Println("write close:", err)
                return
            }
                select {
                case <-done:
                case <-time.After(time.Second):
                }
            c.Close()
            return
        }
    }
}

我是Go的初学者,所以如果我的代码不清晰整洁,请不要犹豫地纠正我。

感谢您的帮助!

EN

回答 1

Stack Overflow用户

发布于 2016-04-02 04:36:19

代码是正确的。服务器https://hide.me不是代理服务器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36356835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档