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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:35:04