node.js - 节点 net.Socket 向所有连接的客户端发送数据
问题描述
伙计们,我正在尝试使用 net.Socket 包制作简单的 TCP 服务器,我正在使用 express 框架。我试图实现的行为是当用户输入特定路由以向所有连接的客户端发送数据时,现在有没有人可以实现这一点?
这是我的示例代码:
const express = require('express');
const app = express();
const cors = require('cors');
const bodyParser = require('body-parser');
const net = require('net');
const PORT = 5000;
let connection;
const server = net.createServer((socket) => {
console.log('CONNECTED: ' + socket.remoteAddress +':'+ socket.remotePort);
connection = socket;
});
app.use(cors());
app.use(bodyParser.json());
app.get('/', (request, response) => {
response.send('VMS server');
});
app.post('/contact', (req, res) => {
const data = { hello: 'hello' }
connection.write(data);
res.send({ data: 'data emmited' })
});
app.listen(PORT, () => {
console.log(`Server running at: http://localhost:${PORT}/`);
});
server.listen(1337, function() {
console.log("Listening on 1337");
});
这里的问题是数据被多次发出,因为我将当前套接字分配给连接变量。
有没有其他方法可以做到这一点,我可以使用服务器变量以某种方式向所有连接的客户端发出吗?
解决方案
好的,设法解决了。以下是我如何解决它的步骤 - 创建一个客户端数组,当客户端连接到服务器时,在断开连接时将该套接字推送到客户端数组从数组中删除该项目......并向所有客户端发出数据,我创建了一个广播方法,我在其中循环客户端数组,并调用每个套接字的发出方法并发送数据。
这是一个示例代码:
const express = require('express');
const app = express();
const cors = require('cors');
const bodyParser = require('body-parser');
const net = require('net');
const PORT = 5000;
let sockets = []; // array of sockets
// emmit data to all connected clients
const broadcast = (msg) => {
//Loop through the active clients object
sockets.forEach((client) => {
client.write(msg);
});
};
const server = net.createServer((socket) => {
console.log('CONNECTED: ' + socket.remoteAddress +':'+ socket.remotePort);
sockets.push(socket);
socket.on('end', () => {
console.log('DISCONNECTED: ');
// remove the client for list
let index = sockets.indexOf(socket);
if (index !== -1) {
console.log(sockets.length);
sockets.splice(index, 1);
console.log(sockets.length);
}
});
});
app.use(cors());
app.use(bodyParser.json());
app.get('/', (request, response) => {
response.send('VMS server');
});
app.post('/contact', (req, res) => {
const data = { hello: 'hello' }
broadcast(data); //emit data to all clients
res.send({ data: 'data emmited' })
});
app.listen(PORT, () => {
console.log(`Server running at: http://localhost:${PORT}/`);
});
server.listen(1337, function() {
console.log("Listening on 1337");
});
推荐阅读
- java - Android Q 范围存储和外部库
- python - HtmlWindow 无法正确显示图像
- git - 检索包文件名
- laravel-echo - Laravel Echo,无需加入频道即可获得用户的存在
- python - 从一组列表创建字典,其中键是每个列表的名称,值是列表
- r - 如何通过从随机化中排除那些包含特定单词列表的段落来从语料库中随机选择段落?
- macos - 在 Mac 上的 NSOutlineView 中更改拖动开始时的选定项目
- amazon-web-services - AWS Elastic Beanstalk (.ebextension) 配置 - IntelliJ 中的支持 .config 文件
- dataframe - 用于爆炸列的 Pyspark 数据框过滤器
- python - 在python的一行中存储一个特定的值