Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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 socket.emit从浏览器到浏览器不触发 带angularjs的socket.emit inside socket.on未触发_Node.js_Angularjs_Socket.io - Fatal编程技术网

Node.js socket.emit从浏览器到浏览器不触发 带angularjs的socket.emit inside socket.on未触发

Node.js socket.emit从浏览器到浏览器不触发 带angularjs的socket.emit inside socket.on未触发,node.js,angularjs,socket.io,Node.js,Angularjs,Socket.io,这是我的密码 socket.emit('event1', 'event1 data'); // This is sent to nodejs server socket.on('login', function(data) { // This is triggered from Nodejs server if(with some condition) { socket.emit('event2', 'event2 data'); // This has to b

这是我的密码

socket.emit('event1', 'event1 data');  // This is sent to nodejs server
socket.on('login', function(data) {   // This is triggered from Nodejs server
    if(with some condition) {
        socket.emit('event2', 'event2 data');  // This has to be sent to browsers,
                                               // but this is not firing
    }
});
事件2从浏览器到浏览器未启动

这是我的角度发球

angular.module('myApp')
.factory('socket', function($rootScope) {
    var socket = io.connect('http://192.168.0.105:5000');
    return {
        on: function (eventName, callback) {
            socket.on(eventName, function () {  
                var args = arguments;
                $rootScope.$apply(function () {
                    callback.apply(socket, args);
                });
            });
        },
        emit: function (eventName, data, callback) {
            socket.emit(eventName, data, function () {
                var args = arguments;
                $rootScope.$apply(function () {
                    if (callback) {
                        callback.apply(socket, args);
                    }
                });
            })
        },
        ioemit: function (eventName, data, callback) {
            console.log(io.sockets);
            io.sockets.emit(eventName, data, function () {
                var args = arguments;
                $rootScope.$apply(function () {
                    if (callback) {
                        callback.apply(socket, args);
                    }
                });
            })
        }
    };
});

 
我只是尝试了一些类似io.sockets.emit的东西,但是没有用。。当您这样做时,任何帮助都是非常可观的

socket.emit('event2', 'event2 data'); 
它将消息发送到您的服务器,而不是其他客户端。因此,服务器必须将该消息发送到相应的客户端。socket.io不直接将客户端发送到客户端。它不是这样做的。它从服务器发送到客户端或从客户端发送到服务器


如果您有其他原因需要将socket.io连接到服务器,那么只需几行代码就可以教会服务器如何将消息从clientA转发到clientB。您只需要一个标识符,clientA可以使用该标识符指示它要向哪个其他客户端发送消息,然后服务器只需要能够将该标识符与clientB的socket.io连接相关联。通常,您可以使用已有的用户名或服务器已知的
socket.id
作为标识符


浏览器通常不会在没有中间服务帮助的情况下进行点对点连接,因为两个客户端通常都位于防火墙后面,因此在不使用中间服务器的情况下在它们之间建立连接很困难。Web浏览器确实支持webRTC,这是一种点对点方案,但仍然需要涉及一个服务器来促进直接的客户端到客户端连接。如果您想了解更多关于webRTC的信息,这里有一个关于它如何工作的示例。如果您已经与服务器建立了socket.io连接,并且您的数据不是超实时的(如语音聊天或视频聊天),那么使用服务器通过socket.io将消息从clientA转发到clientB可能更容易。

执行此操作时:
socket.emit('event2','event2 data'),它将消息发送到您的服务器,而不是其他客户端。因此,服务器必须将该消息发送到相应的客户端。socket.io不直接将客户端发送到客户端。它不是这样做的。它从服务器发送到客户端或从客户端发送到服务器。@jfriend00还有其他选择吗?如果您有其他原因需要将socket.io连接到服务器,只需几行代码就可以教会服务器如何将消息从clientA转发到clientB。您只需要一个标识符,clientA可以使用该标识符指示它要向哪个其他客户端发送消息,然后服务器只需要能够将该标识符与clientB的socket.io连接相关联。通常,您可以使用您已经拥有的用户名或服务器已经知道的
socket.id
作为标识符。浏览器通常不会在没有中间服务的情况下进行点对点,因为两个客户端都位于防火墙之后,所以在不使用中间服务器的情况下在它们之间建立连接很困难。@jfriend00有道理。。感谢客户端
socket.removealllisteners()
@overflow支持这一点-我不知道。它没有列在客户端文档中。如果是,则可能是不同的大写:
socket.removeAllListeners()
。但不确定这与问题有什么关系。@溢出-查看客户端代码,它似乎不支持
socket.removeAllListeners()
.on()
返回一个对象,该对象具有可用于删除单个侦听器的
.destroy()
方法。您可以创建自己的方法来跟踪所有的
.on()
调用,并对所有调用进行销毁。