连接竞争条件下的套接字IO?

时间:2014-12-17 00:17:22

标签: socket.io

我目前正在使用socketio(1.2.0)并且发现似乎客户端connect事件并不意味着连接已准备就绪,是否有其他人看到此问题或者是否有我遗漏的内容?

我有一个相当大的应用程序,在google chrome扩展程序的上下文中运行;但是我已经拿出代码来验证这是问题。

这是我的客户端代码(这有时会起作用,并非总是如此):

var connection = io.connect("http://localhost:3000/myNamespace",
    {transport:"websocket", reconnection:false});
connection.on("connect",function(){
    connection.emit("myEvent",{"testKey":"testData"});
);

这是我的服务器代码:

var namespace = io.of("/myNamespace");
namespace.on("connection",function(handshake) {
    auth.main(handshake , function(error , socket){
        socket.on("myEvent" , function(data){console.log("Event Data:",data);});
    }
}

如果我将我的客户端代码更改为这样,它可以100%的时间工作(只是不使用它):

var connection = io.connect("http://localhost:3000/myNamespace",
    {transport:"websocket",reconnection:false});
connection.on("connect", function() {
    setTimeout(function(){
        connection.emit("myEvent",{"testKey":"testData"});
    },1000);

我已经验证了第一个客户端代码示例中的事件没有通过tcpdump和wireshark发出。

如果套接字可能没有“准备好”但是由于竞争条件而无法发出事件,那么有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这是一个猜测,但对于评论的解释太长了,所以我会把它放在一个答案中。我想知道您的身份验证是否导致延迟,您必须等待身份验证才能完成连接才能正常工作。

如果在身份验证完成后,您向客户端发送消息,并且客户端收到该消息,然后(并且因为您知道auth已完成),您会从客户端发送数据,会发生什么?

客户端:

var connection = io.connect("http://localhost:3000/myNamespace");
connection.on("ready", function(data) {
    console.log("Received ready");
    connection.emit("myEvent",{"testKey":"testData"});
});
connection.on("connect",function(){
    console.log("Received connect");
);

服务器:

var namespace = io.of("/myNamespace");
namespace.on("connection",function(handshake) {
    auth.main(handshake , function(error , socket) {
        socket.emit("ready", true);
        socket.on("myEvent" , function(data){console.log("Event Data:",data);});
    }
}

您似乎在支持的方式之外进行身份验证以进行身份​​验证,因此可能导致时间问题,因为socket.io不了解您的身份验证,因此它会发送连接消息,但您是仍在做自己的身份验证。

您可以在此处看到建议的方法,使用socket.io将auth集成到连接序列中:https://github.com/Automattic/socket.io/wiki/Authorizing