Node WebSocket连接Lightstreamer Server发送命令遇1011错误求助
解决Lightstreamer WebSocket发送命令后1011错误问题
以下是针对代码中问题的具体修复步骤:
1. 修正WebSocket协议头不匹配问题
你手动设置的Sec-WebSocket-Protocol为TLCP-2.2.0.lightstreamer.com,但WebSocket构造函数传入的协议列表是["js.lightstreamer.com", "websocket"],两者不匹配会导致服务器后续命令解析异常。需要将构造函数的协议参数改为与请求头一致的值:
this.ws = new WebSocket("wss://push.lightstreamer.com/lightstreamer", ["TLCP-2.2.0.lightstreamer.com"], { headers, agent: agent, rejectUnauthorized: false });
2. 移除手动设置的Sec-WebSocket-Key
Sec-WebSocket-Key是WebSocket握手时客户端自动生成的随机密钥,手动固定值可能破坏握手后的会话验证逻辑,直接从headers中删除该字段:
// 删除这一行 // headers["Sec-WebSocket-Key"] ="a key==";
3. 确保命令以换行符结尾
Lightstreamer的文本协议要求每个命令必须以**换行符(\n)**作为结束标记,你发送的wsok缺少换行,服务器无法正确识别命令格式,修改发送内容:
this.ws.send(`wsok\n`);
修复后的完整代码
import * as WebSocket from 'ws'; var url = require('url'); var HttpsProxyAgent = require('https-proxy-agent'); class sg{ ws:WebSocket; constructor(){ var headers = {}; headers["Host"] ="push.lightstreamer.com"; headers["User-Agent"] ="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0"; headers["Accept"] ="*/*"; headers["Accept-Language"] ="de,en-US;q=0.7,en;q=0.3"; headers["Accept-Encoding"] ="gzip, deflate, br"; headers["Sec-WebSocket-Version"] ="13"; headers["Origin"] ="https://demos.lightstreamer.com"; headers["Sec-WebSocket-Protocol"] ="TLCP-2.2.0.lightstreamer.com"; headers["Sec-WebSocket-Extensions"] ="permessage-deflate"; headers["Connection"] ="keep-alive, Upgrade"; headers["Sec-Fetch-Dest"] ="websocket"; headers["Sec-Fetch-Mode"] ="websocket"; headers["Sec-Fetch-Site"] ="same-site"; headers["Pragma"] ="no-cache"; headers["Cache-Control"] ="no-cache"; headers["Upgrade"] ="websocket"; var options = url.parse('http://192.168.185.24:8888'); var agent = new HttpsProxyAgent(options); this.ws = new WebSocket("wss://push.lightstreamer.com/lightstreamer", ["TLCP-2.2.0.lightstreamer.com"], { headers, agent: agent, rejectUnauthorized: false }); this.ws.onopen = (e) => { console.log("open") setTimeout(() => { this.ws.send(`wsok\n`); }, 1500); }; this.ws.onmessage = (e) => { console.log("Received:", e.data) } this.ws.onerror = error => { console.log(`WebSocket error: ${error}`) } this.ws.onclose = (event) => { console.log(`Closed: ${event.code} - ${event.reason}`) } } } let xsg = new sg();
额外说明
- 不需要手动设置
Connection和Upgrade头,ws库会自动处理这些握手必需的字段,不过保留也不会有问题; - 添加
onclose监听可以更直观地查看连接关闭时的错误码和原因,方便后续排查问题。
内容的提问来源于stack exchange,提问作者StefanBD
相关产品推荐
相关产品推荐

