【问题标题】:Cannot open web socket无法打开网络套接字
【发布时间】:2010-11-17 09:47:05
【问题描述】:

我正在尝试编写一段代码来打开 Web 套接字。

var ws = null;


var close = function() {
 if (ws) {
  console.log('closing ...');
  ws.close();
 }
}

var onOpen = function() {
 console.log('opening...');
 ws.send('hello. im connected');
};

var onClose = function() {
  console.log('closed');
};

var onMessage = function(event) {
 var data = event.data;
 console.log('message: ' + data);
};

close();

var url = 'ws://localhost:9999';
ws = new WebSocket(url);
ws.onopen = onOpen;
ws.onclose = onClose;
ws.onmessage = onMessage;

console.log('ws: ' + ws);


if (ws)
{
 console.log('url:' + ws.url);
 console.log('readyState:' + ws.readyState);
 ws.send(msg);
 }
 else
 alert('no ws');

但是当看到控制台时,readyState一直是“CONNECTING”,导致socket send()命令抛出异常。

我尝试了扩展 https://chrome.google.com/extensions/detail/pfdhoblngboilpfeibdedpjgfnlcodoo 并遇到了同样的问题。服务器非常简单,接受传入的套接字并写出到控制台。

有最初的握手,但客户端的 readyState 仍然保持为 0。

这是握手:

GET / HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: localhost:9999
Origin: http://localhost:8080
Sec-WebSocket-Key1: Qb 15  05 6 Gq 9   26 u0 6
Sec-WebSocket-Key2: 8096 C0587|7.

我在服务器中有什么特定的东西可以让客户端打开吗?

谢谢大家。

【问题讨论】:

  • 你是否在服务器端解析握手并从两个密钥发回哈希?
  • 你觉得你的问题得到了充分的回答吗? (如果是这样,您可以选择一个答案)。如果没有,我们还能帮助您解决您的问题吗?

标签: javascript websocket


【解决方案1】:

显示握手的块不完整。应该有一个空行,后跟 8 个字节的额外数据(或 key3)。

服务器需要构造一个返回握手,如下所示:

HTTP/1.1 101 Web Socket Protocol Handshake\r
Upgrade: WebSocket\r
Connection: Upgrade\r
Sec-WebSocket-Origin: http://localhost:8080\r
Sec-WebSocket-Location: ws://localhost:9999/\r
Sec-WebSocket-Protocol: sample\r
\r
[16 byte md5 hash]

服务器返回的 16 字节哈希计算如下:

  • 从 key1 数据中获取数字并将它们转换为数字。将此数字除以 key1 数据的空格数。这会给你一个 4 字节的 key1 数字。

  • 对 key2 数据做同样的事情以获得 key2 编号。

  • 通过在 key1 编号(4 字节)后跟 key2 编号(4 字节)以及从客户端接收的 8 字节额外数据(8 字节)打包来创建一个 16 字节数组。

  • md5 将 16 字节数组相加得到一个新的 16 字节数组。这是写入客户端以完成握手响应的内容。

在服务器返回握手之前,客户端将显示“CONNECTING”。

WebSockets version 76 standards document 的第 5.2 节更详细地描述了服务器握手响应

根据第二个问题更新(在答案部分):

如果您只想从扩展发送数据,那么您可以考虑只使用 XMLHttpRequest (AJAX) POST 请求。由于您从请求中得到任何回报,我怀疑延迟对您的应用程序来说并不那么重要。 XMLHttpRequest 应该很容易支持 firefox 和 Chrome 的扩展。

另一方面,如果延迟很重要,或者发送数据的服务器纯粹是一个套接字服务器,那么添加 WebSockets 支持不会比添加 HTTP 支持困难多少(实际上,可能更容易)。 WebSockets 支持也应该支持 Chrome 和 firefox(4.0 及更高版本)中的扩展。

【讨论】:

    【解决方案2】:

    谢谢。

    我不知道这是两种交流方式。

    我正在编写一个 Chrome 扩展程序,它打开一个套接字并将数据发送到特定的应用程序。我使它与FF一起使用,使用下面的套接字:

    var transportService = Components.classes["@mozilla.org/network/socket-transport-service;1"].getService(Components.interfaces.nsISocketTransportService);
    var transport = transportService.createTransport(null,0,"localhost",9999,null);
    

    有没有办法在 Chrome 上使用类似的方法?或者我必须使用 2 种方式通信的 WebSocket?我不想让它变得复杂,因为我必须修改接收器应用程序以返回握手。

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-11
      • 2013-10-04
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      相关资源
      最近更新 更多