CODENAME WebSocket连AWS API Gateway WSS报错:socket未打开问题排查
问题分析:Codename One WebSocket对接AWS API Gateway报错
问题描述
尝试用Codename One的WebSocket对接AWS API Gateway的WebSocket服务器时,触发异常:
java.io.IOException: Attempt to send a message while the socket is not open. CLOSED
需要确认该问题是Codename One的WebSocket不支持wss协议,还是与AWS端的$connect路由实现有关。
相关代码
final WebSocket sock = new WebSocket("wss://xxxx.execute-api.us-east-1.amazonaws.com/development/") { @Override protected void onOpen() { System.out.println("In onOpen"); } @Override protected void onClose(int statusCode, String reason) { System.out.println("Connection closed"); } @Override protected void onMessage(String message) { System.out.println("Received message "+message); } @Override protected void onError(Exception ex) { System.out.println("in onError"); } @Override protected void onMessage(byte[] message) { // Received a binary message } }; //.autoReconnect(5000); // Automatically reconnect if connection fails or server disconnects // Attempts every 5 seconds until successful sock.connect();
排查与解答
1. Codename One对wss的支持
Codename One的WebSocket完全支持wss协议,底层依赖各平台原生实现(Android用OkHttp、iOS用NSURLSession),只要目标服务器的SSL证书可信,就能正常建立加密连接。若存在SSL相关问题,报错会指向证书验证失败,而非当前的"socket未打开"。
2. AWS $connect路由的潜在问题
这个异常更大概率和$connect路由的实现有关:
- 未返回200状态码:AWS API Gateway要求$connect路由必须返回200 OK,否则会直接关闭连接。如果你的$connect Lambda函数返回了403、500等非200状态,或未正确处理请求,API Gateway会立刻断开连接,导致客户端还未完成握手就进入关闭状态,后续发送消息时触发该错误。
- Lambda执行超时:$connect Lambda的默认超时时间是3秒,如果函数执行超时,API Gateway也会强制关闭连接,引发相同问题。
- 认证或配置缺失:若API Gateway配置了自定义域名、API密钥认证,但客户端未携带必要的请求头或参数,会导致连接被拒绝,最终触发socket关闭报错。
3. 额外排查建议
- 完善错误日志:当前onError仅打印提示,建议修改为打印完整异常堆栈,获取更精准的错误信息:
@Override protected void onError(Exception ex) { ex.printStackTrace(); System.out.println("错误详情: " + ex.getMessage()); } - 测试通用wss端点:先连接公开测试端点(如
wss://echo.websocket.events/),验证Codename One的WebSocket功能是否正常,排除客户端自身问题。 - 检查AWS端日志:查看API Gateway的执行日志和$connect Lambda的运行日志,确认连接请求是否到达Lambda,以及Lambda的返回状态是否符合要求。
内容的提问来源于stack exchange,提问作者Oscar Naranjo
相关产品推荐
相关产品推荐

