WebSocket in golang



我正在尝试将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}) 

我在Golang中创建了相同的内容,如下所示:

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: &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

根据我的理解,这是失败的,因为在URL字符串疏忽。任何go参考代码都有助于解决这个问题。

  1. 确保目标端口为443
  2. socketUrlconnection_string = "ws:// 10.1.2.3/socket{0}".format(token),wssws的外观不同。

我试图使用您的代码连接服务器,如果我将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)         

最新更新