【问题标题】:socket.emit from browser to browser not firingsocket.emit 从浏览器到浏览器不触发
【发布时间】:2020-04-18 14:25:01
【问题描述】:

带有 angularjs 的 socket.on 内的 socket.emit 没有触发

这是我的代码

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

event2 从浏览器到到浏览器这没有启动

这是我的角度服务

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 不会直接将客户端发送给客户端。那不是它的作用。它从服务器发送到客户端或从客户端发送到服务器。
  • @jfriend00 还有其他选择吗?
  • 如果您有其他原因需要与服务器建立 socket.io 连接,只需几行代码即可教服务器如何将消息从客户端 A 转发到客户端 B。您只需要一个标识符,clientA 可以使用它来指示它想要向哪个其他客户端发送消息,然后服务器只需要能够将该标识符与 clientB 的 socket.io 连接相关联。通常您可以使用您已经拥有的用户名或服务器已经知道的socket.id 作为标识符。
  • 浏览器通常不会在没有中间服务的情况下进行点对点,因为两个客户端都在防火墙后面,因此在不使用中间服务器的情况下在它们之间建立连接很棘手。
  • @jfriend00 有道理.. 谢谢

标签: node.js angularjs socket.io


【解决方案1】:

当你这样做时:

socket.emit('event2', 'event2 data'); 

它将消息发送到您的服务器,而不是其他客户端。因此,您的服务器必须随后将该消息发送给适当的客户端。 socket.io 不会直接将客户端发送给客户端。那不是它的作用。它从服务器发送到客户端或从客户端发送到服务器。

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

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

【讨论】:

  • 客户端是否支持socket.removealllisteners()
  • @overflow - 我不知道。它未在客户端文档中列出。如果是,它可能是不同的大写:socket.removeAllListeners()。不过,不确定这与问题有什么关系。
  • @overflow - 查看客户端代码,它看起来不支持socket.removeAllListeners()。 .on() 返回一个具有 .destroy() 方法的对象,该方法可用于删除单个侦听器。您可以创建自己的方法来跟踪所有 .on() 调用并在所有这些调用上调用 destroy。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 2019-10-10
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多