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()
调用,并对所有调用进行销毁。