关键词

nodejs 使用nodejs-websocket模块实现点对点实时通讯

使用nodejs-websocket模块实现点对点实时通讯

什么是nodejs-websocket模块

nodejs-websocket是一个用于node.js的WebSocket服务端实现的模块。它依赖Node.js内置的http模块,并支持与浏览器WebSocket协议兼容。

安装nodejs-websocket模块

在终端中执行以下命令进行安装:

npm install nodejs-websocket

创建WebSocket服务

在Node.js中创建WebSocket服务非常简单。我们只需要使用nodejs-websocket模块中的createServer函数,传入一个回调函数即可。

下面是一个简单的示例:

const ws = require('nodejs-websocket');

const server = ws.createServer(function(conn) {
    console.log('New connection');

    conn.on('text', function(str) {
        console.log('Received:', str);
        conn.sendText(str.toUpperCase());
    });

    conn.on('close', function(code, reason) {
        console.log('Connection closed');
    });
});

server.listen(8888);

这个示例中,我们创建了一个WebSocket服务,监听本地的8888端口。每当有一个WebSocket连接上来之后,就会执行回调函数,打印出一句话来表示新连接的到来,并注册了text事件和close事件的回调函数。

其中,text事件会在收到WebSocket客户端发送的文本消息时触发。在这个回调函数中,我们会将收到的文本消息转换为大写并且回发给客户端。close事件会在WebSocket客户端连接断开时触发。

使用WebSocket实现点对点实时通讯

在WebSocket中,我们可以通过conn.sendText方法向服务器发送文本消息,用conn.on方法监听来自服务器的消息。通过这个机制,我们就可以实现点对点的实时通讯。

下面是一个简单的示例:

客户端代码

const ws = new WebSocket('ws://localhost:8888');

ws.addEventListener('open', function() {
    console.log('Connected to server');

    ws.addEventListener('message', function(event) {
        console.log('Received:', event.data);
    });

    document.getElementById('btn-send').addEventListener('click', function() {
        const message = document.getElementById('input-message').value;
        ws.send(message);
    });
});

这个示例中,我们首先创建了一个WebSocket对象,指定了要连接的服务器地址。在open事件回调函数中,我们打印了一句话表示连接成功,并注册了message事件的回调函数。在回调函数中,我们打印出了来自服务器的文本消息。

另外,我们还在页面上添加了一个按钮和一个输入框,用于向服务器发送消息。在按钮的click事件回调函数中,我们通过WebSocket对象的send方法发送了用户在输入框中输入的消息。

服务器端代码

const ws = require('nodejs-websocket');

const server = ws.createServer(function(conn) {
    console.log('New connection');

    conn.on('text', function(str) {
        console.log('Received:', str);

        conn.other = null;
        server.connections.forEach(function(conn) {
            if (conn !== this) {
                this.other = conn;
            }
        }, conn);

        if (this.other) {
            this.other.sendText(str);
        }
    });
});

server.listen(8888);

这个示例中,我们在服务器端改写了text事件的回调函数。在这个回调函数中,我们首先遍历所有的WebSocket连接,查找除当前连接之外的其它连接。如果找到了其它连接,就将当前连接和其它连接关联起来。当我们收到来自某个连接的消息时,就将这条消息发送给关联的其它连接。

实现简单的聊天室

通过使用WebSocket实现点对点实时通讯,我们可以轻松地实现一个简单的聊天室。下面是一个简单的示例:

客户端代码

const ws = new WebSocket('ws://localhost:8888');

ws.addEventListener('open', function() {
    console.log('Connected to server');

    ws.addEventListener('message', function(event) {
        const message = JSON.parse(event.data);

        const li = document.createElement('li');
        li.textContent = message.username + ': ' + message.text;
        document.getElementById('chat').appendChild(li);
    });

    document.getElementById('btn-send').addEventListener('click', function() {
        const message = {
            username: document.getElementById('input-username').value,
            text: document.getElementById('input-message').value
        };
        ws.send(JSON.stringify(message));
    });
});

这个示例中,我们在向服务器发送消息时,JSON序列化了一个包含用户名和消息内容的对象,并在接收到来自服务器的消息时,将其解析为一个包含用户名和消息内容的对象,并将其显示在聊天内容列表中。

服务器端代码

const ws = require('nodejs-websocket');

const server = ws.createServer(function(conn) {
    console.log('New connection');

    const username = 'User' + Math.floor(Math.random() * 1000);

    conn.on('text', function(str) {
        console.log('Received:', str);

        const message = JSON.parse(str);

        server.connections.forEach(function(other) {
            other.sendText(JSON.stringify({
                username: username,
                text: message.text
            }));
        });
    });

    conn.on('close', function(code, reason) {
        console.log('Connection closed');
        server.connections.forEach(function(other) {
            other.sendText(JSON.stringify({
                username: username,
                text: 'has left the chat room'
            }));
        });
    });

    server.connections.forEach(function(other) {
        other.sendText(JSON.stringify({
            username: username,
            text: 'has entered the chat room'
        }));
    });
});

server.listen(8888);

这个示例中,我们在服务器端改写了text事件和close事件的回调函数。在text事件的回调函数中,我们遍历所有的WebSocket连接,将来自当前连接的消息发送给其它连接。在close事件的回调函数中,我们同样遍历所有的WebSocket连接,将连接关闭的消息发送给其它连接。

除此之外,我们还为每个连接生成了一个随机的用户名,并在连接建立和关闭时分别发送了进入聊天室和离开聊天室的消息。

本文链接:http://task.lmcjl.com/news/7024.html

展开阅读全文