当前位置: 首页 > 面试题库 >

Node.js网络套接字+不带socket.io的websocket

弘浩瀚
2023-03-14
问题内容

我正在尝试使用nodejs创建类似聊天的内容。我是nodejs的新手,我想在没有socket.io的情况下创建它(我想了解它的工作原理)。这是我正在使用的代码

var http = require('http');
var net = require('net');


var server = http.createServer(function(req,res){

    res.writeHead(200,{'content-type' : 'text/html'});
    res.write('<a href="./lol/">lol</a><br>');
    res.end('hello world: '+req.url);



    var client = new net.Socket();
    client.connect('7001', '127.0.0.1', function() {

        console.log('CONNECTED TO: ');
        // Write a message to the socket as soon as the client is connected, the server will receive it as message from the client 
        client.write('I am Chuck Norris!');

    });

    // Add a 'data' event handler for the client socket
    // data is what the server sent to this socket
    client.on('data', function(data) {

        console.log('DATA: ' + data);
        // Close the client socket completely
        client.destroy();

    });

    // Add a 'close' event handler for the client socket
    client.on('close', function() {
        console.log('Connection closed');
    });
    //req.

});
server.listen(7000);


require('net').createServer(function (socket) {
    console.log("connected");

    socket.on('data', function (data) {
        console.log(data.toString());
    });
}).listen(7001);

而且一切正常,(我认为)。当我打开localhost:7000时,我收到有关“ CONNECTED TO:”和“ connected”以及“ I am
Chack Norris”的节点CMD消息。之后,我尝试在浏览器控制台中编写:

var conn = new WebSocket('ws://localhost:7001/');

也没有错误,但是当我尝试这一行:

conn.send('lol');

我收到一个错误:“未捕获的DOMException:无法在’WebSocket’上执行’send’:仍处于CONNECTING状态。(…)“

一段时间后,我又收到一个错误:“与’ws:// localhost:7001 /’的WebSocket连接失败:WebSocket打开握手超时”

也许这段代码是错误的,但是我已经尝试了所有通过google找到的内容。有人可以帮我弄这个吗?


问题答案:

如果要创建自己的webSocket服务器以接收来自浏览器的webSocket连接,则必须在服务器上实现webSocket协议。这不仅仅是简单的套接字连接。它具有一个启动序列,该序列以HTTP连接开始,然后“升级”到webSocket协议,包括交换安全信息,然后为通过webSocket发送的所有数据提供webSocket成帧格式。您不仅可以通过webSocket发送纯文本。

您可以在此处查看webSocket协议的外观:编写Websocket服务器。除非您真的真的想为学习目的而创建自己的webSocket服务器,否则我真的建议您获得一个现有的模块,该模块已为您完成了所有棘手的协议工作。

然后,将在webSocket协议之上构建socket.io库,并在其之上添加其他功能和消息格式。

为了让您了解webSocket的连接方式,以下是典型的连接顺序:

浏览器发送连接请求:

GET /chat HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

服务器响应:

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

然后,双方切换到webSocket协议,该协议的数据帧格式如下:

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 ...                |
+---------------------------------------------------------------+

然后,此外,还有ping和pong数据包用于保持活动测试,并且存在一种针对大数据包和分段的方案,客户端/服务器可以协商子协议。



 类似资料:
  • 计算机网络基础 ip地址 为了使网络上的计算机能够彼此识别对方,每台计算机都需要一个IP地址以标识自己。 IPv4:32位,IPv6:64位 OSI七层参考模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 地址解析 地址解析是指将计算机的协议地址解析为物理地址,即MAC(Medium Access Control)地址,又称为媒体访问控制地址。通常,在网络上由地址解析协议(ARP)

  • 是否可以重用socket.id或多次使用它? 假设一个用户在不同的浏览器选项卡中查看同一站点的多个页面。我想使用一个socket.id,socket来处理它们。 如果用户收到通知,它应该在所有选项卡上弹出一个单一的socket.emit。

  • 我写了一个简单的udp服务器客户端应用程序与多播套接字。服务器每6毫秒向三个客户端发送数据包。数据包大小为1200字节。这是每秒166,66个数据包。每当其中一个客户端检测到丢失的数据包时,它将通过单播向服务器发送NACK数据包。 第一个测试:服务器和三个客户端通过以太网连接到路由器TP链路TL-WDR4300(dd wrt),一切正常。 第二次测试:只有服务器通过以太网连接到路由器,其他客户端通

  • 我用的是SpringMVC 4 Tomcat。我的应用程序用@ Autowired SimpMessagingTemplate得到了2个类(A和B)。每个类都有一个调用“convertAndSend”的线程。 A类发送一条由8个双字段和3个长字段组成的消息。它向大约500个主题发送消息,例如“/主题/价格. X”(其中X-一些随机字符串)。频率-在单个循环中每秒最多4次(每个主题)。 B 类发送一

  • 我用Node.js设置了Socket.io,它通过侦听/连接到端口8000(或另一个不是服务器运行端口的端口)在本地开发机器上工作。 当我试图在heroku上做同样的事情时,客户端脚本导入失败了。 我尝试过相对路径 编辑:我实际上是在使用geddy mvc框架,我想让它在heroku上如何设置(基本上就像socket.io一样),我发现这个答案让我看起来可以类似地使用它:GeddyJS&socke

  • 函数 描述 [[socket socket]] 创建一个套接字描述符 [[socketpair socketpair]] 创建一个套接字偶对 [[shutdown shutdown]] 断开套接字连接 [[close close]] 销毁套接字 套接字选项 函数 描述 [[getsockopt sockopt]] [[setsockopt sockopt]] 适用于流式套接字和数据报套接字 流套接