Python WebSocket客户端逻辑转Golang实现连接失败求助
问题根因
你当前的连接报错存在多个可直接定位的问题:
- 协议不匹配:Python原始代码使用
ws://(非加密WebSocket,默认端口80),你的Go代码错误使用wss://(加密WebSocket,默认端口443),请求到未开放的443端口直接触发超时 - TLS配置不符合要求:若实际使用加密WebSocket,需要在TLS配置中开启
InsecureSkipVerify: true,对应Python的check_hostname: False逻辑,跳过证书域名校验 - URL拼接错误:Python连接路径格式为
/socket{token},你的Go代码拼接逻辑错误,未正确将token拼接到路径后 - 逻辑位置不合理:
flag.Parse()、系统中断信号监听不应放在接口处理函数中,重复调用会引发异常
修正后的完整可运行代码
package main import ( "crypto/tls" "fmt" "github.com/gorilla/mux" "github.com/gorilla/websocket" log "github.com/sirupsen/logrus" "net/http" ) var dialer = websocket.Dialer{ TLSClientConfig: &tls.Config{ // 对应Python的check_hostname: False配置,跳过证书校验 InsecureSkipVerify: true, }, } 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) { token := "GkZl5NLRZJl5+jqChouaZ9CYjgE58W/pMccR+LeXmdO0obG9NBIwo1VBo7+YC1oiJL9mS6I9qh62BkX+Xddhe0JYrTmSG4JcKZ4t3bcP2Mxy3VBmgoJjwZ76ZOuf9V9AD6Xl83lyoR4bLBzqbSSU1R2NIgUotCGWjZt5JX6CJF0=" // 修正1:和Python代码保持一致使用ws协议,若服务端确实是加密wss再改回wss:// socketUrl := "ws://10.1.2.3" + fmt.Sprintf("/socket%s", token) log.Println("Connecting to nexus event channel...") conn, _, err := dialer.Dial(socketUrl, nil) if err != nil { log.Error("dial:", err) // 接口内不要用log.Fatal,会直接终止整个服务进程 http.Error(writer, err.Error(), http.StatusInternalServerError) return } 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) } }() // 你的原有心跳、中断逻辑可以根据实际需求保留,这里移除了放在handler内不合理的全局信号监听逻辑 for { select { case <-done: return } } }
关键修改说明
- 协议对齐:默认使用和Python代码一致的
ws://协议,若确认服务端为加密WebSocket,再将协议改为wss://即可 - TLS配置匹配:新增
InsecureSkipVerify: true配置,完全对齐Python的sslopt={"check_hostname": False}逻辑 - 路径拼接修正:正确生成
/socket{token}格式的请求路径 - 异常逻辑优化:接口处理函数内不再使用
log.Fatal避免直接终止整个服务进程,移除不合理的全局信号监听逻辑 - 复用Dialer:将Dialer提到全局,避免每次请求重复创建,提升性能
内容的提问来源于stack exchange,提问作者Suresh Chand
相关产品推荐
相关产品推荐

