gpt4 book ai didi

javascript - 无法打开网络套接字

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:37:11 24 4
gpt4 key购买 nike

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

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.

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

谢谢你们。

最佳答案

您显示握手的 block 不完整。应该有一个空行,后跟 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 及更高版本)中的扩展。

关于javascript - 无法打开网络套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4203191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com