# #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:
- Убедитесь, что целевой порт равен 443.
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)