【问题标题】:Websocket connection closes with error 1006 (Webdis)Websocket 连接关闭并出现错误 1006 (Webdis)
【发布时间】:2014-05-03 23:00:29
【问题描述】:

我在 Debian 7 32 上使用 Redis + Webdis。

我的问题是,在完成第一个命令后,所有 websocket 连接都以退出代码 1006 关闭(“订阅”命令除外)。例如,对于这个 testJSON() 函数

function testJSON() {
  var jsonSocket = new WebSocket("ws://ip:7379/.json");
  jsonSocket.onopen = function() {
    console.log("JSON socket connected!");
    jsonSocket.send(JSON.stringify(["SET", "hello", "world"]));
    jsonSocket.send(JSON.stringify(["GET", "hello"]));
  };
  jsonSocket.onmessage = function(messageEvent) {
    console.log("JSON received:", messageEvent.data);
  };
  jsonSocket.onclose = function(messageEvent) {
    //some logging
  };
  jsonSocket.onerror = function(messageEvent) {
    //some logging
  };
}
testJSON();

我得到(在 Firebug 中)

JSON socket connected!
JSON received: {"SET":[true,"OK"]}
onClose: error.code 1006

onError 事件不起作用,在 {"SET":[true,"OK"]} 响应后我的连接关闭。 GET 命令也不起作用。 Firefox 和 Chrome 中的行为相同。我检查了标题,似乎它们是有效的。

有什么建议吗?

【问题讨论】:

  • 1006 是一个特殊代码,表示浏览器实现异常(本地)关闭了连接。我尝试了您的示例并将服务器更改为 ws://echo.websocket.org 它似乎工作正常。你的浏览器版本是多少?您可以尝试连接到 echo.websocket.org 并检查您是否仍然断开连接。
  • 嗨。 TY,与 ws://echo.websocket.org 的连接运行良好,没有任何问题。我对不正确的服务器响应有一些建议,但似乎 webdis 无法记录 websocket 操作。我使用 FF 27.0.1

标签: javascript websocket redis webdis


【解决方案1】:

好的,这是一个功能,而不是错误。在代码中(websocket.c):

if (cmd_is_subscribe(cmd)) {
    r->keep_alive = 1;
}

更改此代码解决了我的部分问题,但不是全部。

【讨论】:

  • 看起来 webdis 只为 (p)subscribe 命令保持 websocket 连接打开。客户端应该打开一个持久订阅/监听连接,然后为每个发布/设置/获取命令打开一个单独的连接?最好将 ajax 用于其他非订阅命令,减少 http-upgrade ws 开销。
猜你喜欢
  • 2016-03-13
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
相关资源
最近更新 更多