WebSocket 在发送时关闭
Posted
技术标签:
【中文标题】WebSocket 在发送时关闭【英文标题】:WebSocket closes on send 【发布时间】:2011-03-22 16:45:11 【问题描述】:所以我看到了这篇很棒的博文,Experimenting with Node.js。我决定尝试使用作者的gist 自行设置。没用。
进一步调试显示 websocket 连接正常,但在调用“发送”后立即关闭。这是wireshark跟踪(请原谅奇怪的间距):
GET /test HTTP/1.1
Host: 127.0.0.1:8000
Sec-WebSocket-Key2: 3 j 92 9 62" 7 0 8 8
Upgrade: WebSocket
Connection: Upgrade
Origin: http://127.0.0.1:3000
Sec-WebSocket-Key1: 96'5% S72.93?06
......(bHTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: http://127.0.0.1:3000
Sec-WebSocket-Location: ws://127.0.0.1:8000/test
.4.R....mh......"action":"move","x":450,"y":22,"w":1146,"h":551.
我在 Chrome 和 Firefox 4.0 beta 中都试过了。它们都表现出相同的行为。如果我去original blog site,它工作正常。
另一件事。如果我在 FF 或 Chrome 中进入 JS 控制台并执行以下操作:
ws = new WebSocket('ws://localhost:8000/test')
ws.send("foo")
它立即断开连接并且不发送消息。服务器显示连接和握手,但从未收到消息。
我在这里发现了一些类似的问题,但要么在没有发布修复程序的情况下得到解决,要么似乎不适用于这种情况。如果方便的话,我可以从gist 发布代码。
【问题讨论】:
【参考方案1】:CloseEvent 有一个“代码”属性,可以为您提供有关关闭连接原因的信息。
“返回一个包含服务器发送的关闭代码的无符号短整数。以下值是允许的状态代码。”
支持多种代码值。以下是最突出的:
1000:CLOSE_NORMAL 1001:CLOSE_GOING_AWAY 1002:CLOSE_PROTOCOL_ERROR 1003:关闭_不支持 1005:CLOSE_NO_STATUSSee CloseEvent API docs on MDN 了解更多。
【讨论】:
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review 非常感谢您的建议。下次我会记住的!【参考方案2】:严重的头部打击。尽管我相信我安装了最新版本的 Node.js,但我没有。我有几台装有 Node.js 的机器,我一定是迷路了。我有 Node.js v0.1.96。升级到 v0.1.102 后,一切正常。
对不起各位! :-D
【讨论】:
【参考方案3】:在 android 中,对我而言,问题在于我如何处理数据。通过执行以下操作,我能够查明。
检查 NodeJs(服务器)中是否有问题 - 通过评论发送项目 ws.send(JSON.stringify(whatever));
。
检查 Android(客户端)是否有问题 - 通过评论 onMessage。 Log.d("TAG","onMessage: " +text);
然后看看你是如何处理数据的并注释掉那些部分。在onClosed, onFailure
上运行日志猫
这至少可以帮助您查明问题,因为很难找到 NodeJs Websocket 帮助。 Languages are not hard - its the documentation, support and lack of community which is difficult.
好厨艺书籍,项目视频教程难得。
我以 Json 数组的形式获取数据,并试图以错误的方式填充到回收站视图中。这就是我的问题。
您还应该在 node.js 文件中尝试以下代码以查看原因
// Connection Closed
ws.on('close', function close(code, reason)
console.log('ws is closed with code: ' + code + ' reason: ' + reason);
);
// On Error
ws.on('error', function(e)
console.log("error occured" +e);
);
完整的问题和解决方案请看这里:Websocket closed code: 1006 Node Android okhttp3 AmazonEc2
【讨论】:
【参考方案4】:对于从浏览器发出发送时发生断开连接的问题,您需要等待 onopen 事件触发后再发出发送:
var conn = new WebSocket('ws://localhost:8000/test');
conn.onopen = function (e)
conn.send('foo');
conn.onmessage = function (e)
console.log('got: ' + e.data);
【讨论】:
以上是关于WebSocket 在发送时关闭的主要内容,如果未能解决你的问题,请参考以下文章
关闭浏览器时,浏览器可以执行“关闭”WebSocket 事件吗?