我试图写一段代码来打开网络套接字。
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.
服务器中是否有任何特定内容可以打开客户端?
谢谢你们。
答案 0 :(得分: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及更高版本)中的扩展。
答案 1 :(得分:0)
感谢。
我不知道这是两种沟通方式。
我正在编写一个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通信?我不想让它变得复杂,因为我必须修改接收器应用程序以返回握手。
感谢。