猿问

是否可以通过 websockets 或其他协议传输 TCP 连接?

我想知道,是否可以通过 websockets 协议传输/隧道 TCP 连接?


有一个websockets 包,似乎我可以将 TCP 连接 io.copy 到 websockets 连接中,但我不知道如何在另一端将其重新组装为 TCPConn。


例如,我想在一端创建一个 socks5 ServerN(在 NAT 后面),在另一端创建一个 ServerIE。互联网用户会向 ServerIE 发出socks5 请求(通过socks5 协议),ServerIE 会通过websocket 连接将socks5 请求发送到ServerNAT。ServerNAT 然后将处理socks5 请求(即它是socks5 服务器)。


编辑: 我写了一些代码,但不幸的是它在从 TCP 连接读取到 WS 时卡住了。运行它:go run main.go -logtostderr


package main


import (

    "flag"


    log "github.com/golang/glog"

    "golang.org/x/net/websocket"

    "bufio"

    "net"

    "net/http"

    "time"

//  "io"

)


func main() {

    flag.Parse()

    defer log.Flush()

    log.Infof("wsServer()")

    wsCh := wsServer()

    log.Infof("wsNAT()")

    natWS, err := wsNAT()

    if err != nil {

        log.Error(err)

        return

    }

    done := make(chan struct{}, 1)

        log.Infof("listenTCP()")

        conn := listenTCP()

        buf := bufio.NewReader(conn)

    go func() {

        log.Infof("Write TCP to WS")

        n, err := buf.WriteTo(natWS)

        if err != nil {

            log.Fatal(err)

            return

        }

        log.Infof("newConn.ws.ReadFrom(conn) %v", n)

        close(done)

    }()

    wsToTCP(<- wsCh)

    <-done

}

// wsNAT dials /ws endpoint and returns a websocket connection.

func wsNAT() (*websocket.Conn, error) {

    time.Sleep(1 * time.Second)

    origin := "http://localhost/"

    url := "ws://localhost:12345/ws"

    return websocket.Dial(url, "", origin)

}

 // wsServer returns the websocket

 // connections received on /ws endpoint

func wsServer() chan *websocket.Conn {

    wsCh := make(chan *websocket.Conn, 1)

    http.Handle("/ws", websocket.Handler(func(ws *websocket.Conn) {

        wsCh <- ws

        time.Sleep(1 *time.Hour)

    }))

    go func() {

        err := http.ListenAndServe(":12345", nil)

        if err != nil {

            panic("ListenAndServe: " + err.Error())

        }

    }()

    return wsCh

}


要触发 TCP 侦听器,您可以在端口 8080 上发出请求(例如curl --socks5 localhost:8080 google.com -v或curl localhost:8080 -v)


莫回无
浏览 172回答 1
1回答
随时随地看视频慕课网APP

相关分类

Go
我要回答