Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Nodejs套接字写入所有连接_Node.js_Sockets - Fatal编程技术网

Node.js Nodejs套接字写入所有连接

Node.js Nodejs套接字写入所有连接,node.js,sockets,Node.js,Sockets,我在节点中有一个套接字服务器。当它恢复一条新消息时,会将其写入套接字。但它从中恢复,写入相应的套接字,而不是所有连接 Server.js var server = net.createServer(function(sock){ console.log('new client connected'); sock.on('data', function(data) { console.log('Server received'); // **

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

Server.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...');

    });

}); 
Client.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);
});

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

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

var客户机=[];
var server=net.createServer(函数(sock){
log(“新连接的客户端”);
客户。推(袜子);
sock.on('data',函数(data){
log('Server received');
对于(var i=0;i

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

按照我的建议,使用
跟踪所有连接的套接字,这是实现这一点的一种方法。此实现通过侦听
connect
事件和
end
事件来维护
Set
连接的来去

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


如果要跟踪所有当前连接,还必须在断开连接时从
客户端
数组中删除项目。@jfriend00您的意思是我必须在
一旦关闭
事件中删除它们?我如何知道必须删除哪个索引?@vahidnajafi-如果它是一个简单数组,那么您必须搜索该数组(可能使用
.indexOf()进行搜索)
用于匹配的
套接字
以找到要删除的正确索引。就我个人而言,我可能会使用Set对象,而不是数组,因为顺序并不重要,而且Set使添加、删除和迭代项变得容易。如果你想跟踪,使用object更好,正如@jfriend00建议的那样。在存储套接字之前,为其设置属性,类似于socket.name。然后将该名称设置为键,将socket ref设置为值。@Binbo-我不建议使用普通对象。我建议使用一个set对象,它允许您直接将套接字添加到集合中-无需为其命名。谢谢。这正是我所需要的。
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..');
   });

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

});