在socket.io中,我们创建一个实例并使用这样的套接字
var server = require('http').createServer();
var io = require('socket.io')(server);
io.on('connection', function(socket){
socket.on('event', function(data){});
socket.on('disconnect', function(){});
});
server.listen(3000);
我们如何在其他函数中创建套接字事件。对此有什么办法或诀窍。
var server = require('http').createServer();
var io = require('socket.io')(server);
io.on('connection', function(socket){
socket.on('event', function(data){});
socket.on('disconnect', function(){});
});
var f1 = function (socketID) {
if(socketID){
io.to(socketID).emit('event1', 'event1 data'); //working
socket.on('call2', function (data) { // not working
});
}
}
server.listen(3000);
答案 0 :(得分:0)
当您发送请求并尝试等待对该请求的特定响应时,对于这种情况使用基于消息的协议(如socket.io)有点棘手。 HTTP完美地设计用于请求/响应,因为单个连接仅用于那个请求/响应,因此响应是属于您的请求的响应。
socket.io不是这样。这是一个基于消息的方案。当您发送消息然后等待来自另一端的消息(在多用户环境中)时,您必须非常小心,不要:
解决此问题的一种方法是向所有请求/响应消息添加请求标识符。发送请求时,您将添加唯一的请求ID。返回响应时,它包含该请求ID,然后您的代码可以告诉哪个响应属于哪个请求。
以下是关于如何实现请求ID概念的想法(这需要另一端合作并返回它发送的相同请求ID):
var idCntr = 0;
function f1(socketID) {
if(socketID){
var id = idCntr++;
io.to(socketID).emit('event1', {id: id, data: 'event data'});
function listener(data) {
// if this is our message
if (data.id === id) {
// once our response is received, remove event handler
socket.removeListener('responseToEvent1', listener);
// process response here
// code here...
}
}
// wait for our response
socket.on('responseToEvent1', listener);
}
}
或者,这是一个更面向对象的方案,它将一个方法添加到名为.emitRequest()
的套接字对象中:
var idCntr = 0;
socket.emitRequest = function(msg, data, responseMsg, responseFn) {
var id = idCntr++;
function listener(response) {
// if this is our message
if (response.id === id) {
// once our response is received, remove event handler
this.removeListener(responseMsg, listener);
// call response handler
responseFn(response.data);
}
}
this.emit(msg, {id: id, data: data});
this.on(responseMsg, listener);
}
注意:对于这两段代码,连接的另一端需要合作并返回原始请求的id
属性,以便接收侦听器可以判断哪个响应与哪个请求有关。< / p>