我目前正在使用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发出。
如果套接字可能没有“准备好”但是由于竞争条件而无法发出事件,那么有什么想法吗?
答案 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