使用go-stomp/stomp/v3搭建STOMP服务器时遇Socket hang up错误求助
问题分析与解决
问题原因
服务器日志的invalid command错误,说明客户端发送的初始数据不符合STOMP协议规范。结合你代码里错误的"WebSocket server error"注释,大概率是客户端用了WebSocket方式连接,但你的服务器是基于纯TCP的STOMP服务——github.com/go-stomp/stomp/v3/server的Serve方法默认处理STOMP over TCP协议,不支持WebSocket,客户端用WebSocket连接会发送HTTP握手数据,服务器无法识别为STOMP命令,因此报错。
另外你的代码还有两处疏漏:
- 忽略了
net.Listen的错误,端口占用等启动问题无法及时暴露 - 错误日志里的"WebSocket server error"描述错误,和实际的TCP STOMP服务器不符
解决方案
1. 修正服务器代码
修复错误处理与日志描述,确保服务器可靠启动:
package main import ( "fmt" "log" "net" "sync" "github.com/go-stomp/stomp/v3/server" ) func main() { addr := ":61613" // 必须处理Listen的错误 l, err := net.Listen("tcp", addr) if err != nil { log.Fatalf("Failed to listen on %s: %v", addr, err) } defer l.Close() var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() err := server.Serve(l) if err != nil { // 修正日志描述为STOMP服务器错误 log.Fatalf("STOMP server error: %v", err) } }() fmt.Printf("STOMP server is running on port %s. Press Ctrl+C to stop...\n", addr) wg.Wait() fmt.Println("STOMP server has been shut down") }
2. 使用正确的STOMP客户端
必须用支持STOMP over TCP的客户端连接,比如用同库的客户端示例测试:
package main import ( "log" "github.com/go-stomp/stomp/v3" ) func main() { conn, err := stomp.Dial("tcp", "localhost:61613") if err != nil { log.Fatalf("Failed to connect: %v", err) } defer conn.Disconnect() log.Println("Connected successfully") }
3. 若需支持WebSocket
如果你确实需要WebSocket版本的STOMP服务器,需自行处理WebSocket握手,再将连接转换为STOMP协议。可以借助net/http和github.com/gorilla/websocket库实现:
- 创建HTTP服务器,处理WebSocket升级请求
- 将升级后的WebSocket连接封装为
net.Conn接口(可通过gorilla/websocket.Conn的UnderlyingConn()获取底层TCP连接,或自行实现适配) - 将封装后的连接交给
server.HandleConn处理
验证步骤
- 启动修正后的服务器
- 运行TCP STOMP客户端代码,此时应能成功连接,不再出现"Socket hang up"和"invalid command"错误
内容的提问来源于stack exchange,提问作者hideous
相关产品推荐
相关产品推荐

