gpt4 book ai didi

node.js - 没有模块的Nodejs websockets

转载 作者:行者123 更新时间:2023-12-05 01:37:45 24 4
gpt4 key购买 nike

因此,当我使用 net.createConnection() 它工作正常,但我如何才能使用客户端 javascript 向服务器发送数据或从服务器接收数据,例如:

let ws = new WebSocket("ws://localhost:8000")
ws.onopen = () => {
ws.send("sending data")
}

任何例子将不胜感激

最佳答案

一个 webSocket 连接有它自己的连接方案(以 http 连接开始),一个从 http 到 webSocket 协议(protocol)的升级方案,它自己的安全协商方案和它自己的数据格式,并且在规范中有一些变化时间,这意味着您可能必须支持多个版本才能支持所有客户端。要实现 webSocket 服务器,您必须实现所有这些。

原始协议(protocol)在这里定义:https://www.rfc-editor.org/rfc/rfc6455

简而言之:

  1. 每个 webSocket 连接都以一个 http 请求开始,该请求包含一些自定义 header ,表明这是一个“升级”到 webSocket 协议(protocol)的请求。该初始请求还包含一个安全 key 和一个安全版本号。

  2. 如果服务器接受升级到 webSocket 协议(protocol),它会发回带有另一个安全 key 的响应。

  3. 在收到确认后,客户端或服务器可以开始使用 webSocket 数据帧数据包格式并使用适当的安全 key 向另一方发送数据包。

例子:

客户端发送:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

服务器响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

然后,数据框从 MDN 看起来如何:

0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+

您可以在这些其他答案中看到关于协议(protocol)如何进行的其他一些讨论:

nodejs net sockets + websocket without socket.io

Do websocket implementations use http protocol internally?

What's the difference between WebSocket and plain socket communication?

除非这是出于学习原因的纯粹学术练习,否则这是对您的开发人员时间的真正非常低效的使用,以重新实现一个低级协议(protocol),该协议(protocol)已经存在标准的、经过良好测试的开源实现。您将花费大量时间进行低级位操作和与不同客户端实现的兼容性测试,然后随着标准的不断发展,您将花费更多时间进行维护。

关于node.js - 没有模块的Nodejs websockets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60551382/

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