nodejs net sockets + websocket without socket.io



我正在尝试使用nodejs创建类似聊天的东西。我是一个新手在nodejs,我想创建它没有套接字。我想知道它是如何工作的。这是我正在使用的代码。

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时,我得到关于"连接到"one_answers"连接"one_answers"我是查克诺里斯"的节点CMD消息。在那之后,我试图在浏览器控制台写:

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

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

conn.send('lol');

我得到一个错误:"未捕获的DOMException:未能在'WebSocket'上执行'send':仍处于连接状态。(…)"

一段时间后,我得到一个更多的错误:"WebSocket连接到'ws://localhost:7001/'失败:WebSocket打开握手超时"

也许这段代码是错误的,但我已经尝试了我通过谷歌找到的一切。有人能帮我一下吗?

如果你想创建自己的webSocket服务器来接收来自浏览器的webSocket连接,你必须在你的服务器上实现webSocket协议。它不仅仅是一个简单的套接字连接。它有一个启动序列,从HTTP连接开始,然后"升级"到webSocket协议,包括安全信息的交换,然后有一个webSocket帧格式,用于通过webSocket发送的所有数据。你不只是通过webSocket发送纯文本。

你可以在这里看到webSocket协议的样子:编写webSocket服务器。除非你真的想让你自己的webSocket服务器只是为了学习的目的,我真的建议你得到一个现有的模块,已经为你做了所有的细节协议工作。

套接字。然后在webSocket协议的基础上构建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数据包用于保持活动测试,有一个方案用于大数据包和碎片,客户端/服务器可以协商子协议。

如上所述,除非你真的需要/想要,否则最好不要编写自己的套接字服务器。

一个简单接口的socket服务器是ws https://github.com/websockets/ws

只需几行就可以开始在服务器端发送和接收消息。

同时,在客户端你不需要一个库,只需要:
new WebSocket('wss//echo.websocket.org')

阅读更多

相关内容

  • 没有找到相关文章

最新更新