使用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连接,将连接关闭的消息发送给其它连接。
除此之外,我们还为每个连接生成了一个随机的用户名,并在连接建立和关闭时分别发送了进入聊天室和离开聊天室的消息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nodejs 使用nodejs-websocket模块实现点对点实时通讯 - Python技术站