You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
		}
	}
}
关键修改说明
  1. 协议对齐:默认使用和Python代码一致的ws://协议,若确认服务端为加密WebSocket,再将协议改为wss://即可
  2. TLS配置匹配:新增InsecureSkipVerify: true配置,完全对齐Python的sslopt={"check_hostname": False}逻辑
  3. 路径拼接修正:正确生成/socket{token}格式的请求路径
  4. 异常逻辑优化:接口处理函数内不再使用log.Fatal避免直接终止整个服务进程,移除不合理的全局信号监听逻辑
  5. 复用Dialer:将Dialer提到全局,避免每次请求重复创建,提升性能

内容的提问来源于stack exchange,提问作者Suresh Chand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:48:02