Веб-карман в голанге

# #go #websocket #http-headers

Вопрос:

Я пытаюсь преобразовать строку подключения клиента Python websocket в Golang. Это код на Python

 from websocket import create_connection

connection_string = "ws:// 10.1.2.3/socket{0}".format(token)

ws = create_connection(connection_string, sslopt={"check_hostname": False}) 
 

Я создал то же самое в Голанге, что и ниже:

 package main

import (
    "crypto/tls"
    "flag"
    "fmt"
    "github.com/gorilla/mux"
    "github.com/gorilla/websocket"
    log "github.com/sirupsen/logrus"
    "net/http"
    "os"
    "os/signal"
    "time"
)

func main() {
    router := mux.NewRouter()
    router.HandleFunc("/nexus", nexus).Methods("POST")
    log.Fatal(http.ListenAndServe(":12345", router))
}

func nexus(writer http.ResponseWriter, request *http.Request) {
    flag.Parse()

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

    token := "GkZl5NLRZJl5 jqChouaZ9CYjgE58W/pMccR LeXmdO0obG9NBIwo1VBo7 YC1oiJL9mS6I9qh62BkX Xddhe0JYrTmSG4JcKZ4t3bcP2Mxy3VBmgoJjwZ76ZOuf9V9AD6Xl83lyoR4bLBzqbSSU1R2NIgUotCGWjZt5JX6CJF0="

    socketUrl := "wss://"   "10.1.2.3"   "/socket"   fmt.Sprintf(token)

    log.Println("Connecting to nexus event channel...")
    config := tls.Config{}
    dialer := websocket.Dialer{
        TLSClientConfig: amp;config,
    }
    //check_hostname:=false
    //request.Header.Add("check_hostname","false")
    conn, _, err := dialer.Dial(socketUrl, nil)
    if err != nil {
        log.Fatal("dial:", err)
    }
    defer conn.Close()
    done := make(chan struct{})

    go func() {
        defer close(done)
        for {
            _, message, err := conn.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 <-done:
            return
        case t := <-ticker.C:
            err := conn.WriteMessage(websocket.TextMessage, []byte(t.String()))
            if err != nil {
                log.Println("write:", err)
                return
            }
        case <-interrupt:
            log.Println("interrupt")

            // Cleanly close the connection by sending a close message and then
            // waiting (with timeout) for the server to close the connection.
            err := conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
            if err != nil {
                log.Println("write close:", err)
                return
            }
            select {
            case <-done:
            case <-time.After(time.Second):
            }
            return
        }
    }
}
 

Когда я пытаюсь позвонить ему от клиента, я получаю сообщение об ошибке:

 time="2021-10-07T12:45:22 05:30" level=info msg="Connecting to nexus event channel..."
time="2021-10-07T12:45:43 05:30" level=fatal msg="dial:dial tcp 10.1.2.3:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond."

Process finished with the exit code 1
 

Насколько я понимаю, это не удается из-за sslopt в строке URL. Любой ссылочный код go поможет решить эту проблему.

Ответ №1:

  1. Убедитесь, что целевой порт равен 443.
  2. socketUrl Внешность отличается от connection_string = "ws:// 10.1.2.3/socket{0}".format(token) , wss или ws .

Я попытался подключить сервер с помощью вашего кода, это сработало, если я изменюсь wss на ws .

 p1gd0g$ gor main.go
INFO[0000] Connecting to nexus event channel...         
INFO[0001] recv: 2021-10-08 21:13:36.7483105  0800 CST m= 1.001602801 
INFO[0002] recv: 2021-10-08 21:13:37.748889  0800 CST m= 2.002181301 
INFO[0003] recv: 2021-10-08 21:13:38.7482128  0800 CST m= 3.001505101 
INFO[0004] recv: 2021-10-08 21:13:39.74902  0800 CST m= 4.002312301 
INFO[0005] recv: 2021-10-08 21:13:40.74893  0800 CST m= 5.002222501 
^CINFO[0005] interrupt                                    
INFO[0005] read: websocket: close 1000 (normal)