首页 > 解决方案 > 节点 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");
});

这里的问题是数据被多次发出,因为我将当前套接字分配给连接变量。

有没有其他方法可以做到这一点,我可以使用服务器变量以某种方式向所有连接的客户端发出吗?

标签: node.jsexpresssocketssocket.io

解决方案


好的,设法解决了。以下是我如何解决它的步骤 - 创建一个客户端数组,当客户端连接到服务器时,在断开连接时将该套接字推送到客户端数组从数组中删除该项目......并向所有客户端发出数据,我创建了一个广播方法,我在其中循环客户端数组,并调用每个套接字的发出方法并发送数据。

这是一个示例代码:

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");
});

推荐阅读