代码之家  ›  专栏  ›  技术社区  ›  Vahid Najafi

Nodejs套接字写入所有连接

  •  0
  • Vahid Najafi  · 技术社区  · 6 年前

    我在节点中有一个套接字服务器。当它恢复一条新消息时,它会将其写入套接字。但它从中复活,写入相应的套接字,而不是所有连接。

    服务器.js

    var server = net.createServer(function(sock){
    
        console.log('new client connected');
    
        sock.on('data', function(data) {
            console.log('Server received');
    
            // ** NOT sending to all clients **
            sock.write('broadcasting to others...');
    
        });
    
    }); 
    

    客户端.js

    var client = new net.Socket();
    
    client.connect(PORT, HOST, function() {
        console.log('Client connected to: ' + HOST + ':' + PORT);
        // 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('Client is connected!!');
    
    });
    
    client.on('data', function(data) {    
        console.log('Client received: ' + data);
    });
    

    如何将一个客户端消息广播给所有其他客户端?

    2 回复  |  直到 6 年前
        1
  •  7
  •   jfriend00    6 年前

    按照我的建议使用 Set 要跟踪所有连接的套接字,这是实现该功能的一种方法。这个实现坚持 当连接来来去去去都听 connect 事件和 end 事件。

    此实现还支持一个理想的功能,可以发送到所有连接的套接字,但触发事件的套接字除外(我认为这正是您的情况所需要的):

    // Set of all currently connected sockets
    const connectedSockets = new Set();
    
    // broadcast to all connected sockets except one
    connectedSockets.broadcast = function(data, except) {
        for (let sock of this) {
            if (sock !== except) {
                sock.write(data);
            }
        }
    }
    
    const server = net.createServer(function(sock){
        console.log('new client connected');
        connectedSockets.add(sock);
    
        sock.on('end', function() {
            connectedSockets.delete(sock);
        });
    
        sock.on('data', function(data) {
            console.log('Server received');
    
            connectedSockets.broadcast(data, sock);
        });
    
    }); 
    
        2
  •  1
  •   Binbo    6 年前

    我相信,当每个客户机与服务器建立连接时,您可以始终将它们的套接字引用保留在一个数组中。要广播,只需循环数组并使用 write()

    var clients = [];
    var server = net.createServer(function(sock){
    
       console.log('new client connected');
       clients.push(sock);
    
       sock.on('data', function(data) {
            console.log('Server received');
            for(var i = 0; i < clients.length; i++) clients[i].write('broadcasting..');
       });
    
    });
    

    或者如果您在服务器和客户机上都有控制权,我认为最好使用 websocket socket.io 因为它提供广播功能。