Ballerina同一端口运行HTTP与WebSocket监听器返回500无消息错误排查
在Ballerina同一端口运行HTTP与WebSocket服务的正确方式
可以在Ballerina中实现同一端口同时处理HTTP请求与WebSocket请求,你的代码问题在于WebSocket服务的挂载对象错误。
错误原因分析
你创建了单独的websocket:Listener并将WebSocket服务挂载在该监听器上,但当需要复用HTTP端口时,WebSocket服务应该直接挂载到HTTP监听器上。Ballerina会自动识别WebSocket握手请求并完成协议升级,无需单独维护WebSocket监听器实例。
修正后的代码
import ballerina/io; import ballerina/websocket; import ballerina/http; // 只需要一个HTTP监听器监听目标端口 listener http:Listener httpListener = new http:Listener(9090); // 普通HTTP服务,处理HTTP请求 service /api on httpListener { resource function get .() returns string { return "Hello from HTTP service!"; } } // WebSocket服务,挂载到同一个HTTP监听器 service /chat on httpListener { // 通过GET资源函数处理WebSocket握手,返回WebSocket服务实例 resource function get .() returns websocket:Service { return new ChatService(); } } service class ChatService { *websocket:Service; remote function onMessage(websocket:Caller caller, string chatMessage) returns error? { io:println(chatMessage); check caller->writeMessage("Hello!, How are you?"); } }
关键修改点
- 移除了单独的
websocket:Listener实例,所有服务(HTTP和WebSocket)都挂载到同一个http:Listener上 - WebSocket服务通过在HTTP服务的
get资源函数中返回websocket:Service实例,自动触发WebSocket握手流程
这样修改后,访问http://localhost:9090/api会得到HTTP响应,而向ws://localhost:9090/chat发起WebSocket连接请求会成功完成握手并建立连接。
内容的提问来源于stack exchange,提问作者André Alves
相关产品推荐
相关产品推荐

