如何在 Socket.IO 中模拟连接失败

Posted

技术标签:

【中文标题】如何在 Socket.IO 中模拟连接失败【英文标题】:How to simulate a connection failure in Socket.IO 【发布时间】:2011-11-05 21:39:26 【问题描述】:

我正在开发一个应用程序,其中客户端通过 Socket.io 连接到 nodejs 服务器并订阅各种事件。这些订阅相当复杂,无法使用 Socket.IO 的频道功能处理。

这意味着客户端需要跟踪其订阅,并且在断开连接时可能必须重新订阅。不幸的是,我不太确定 Socket.IO 是如何处理重新连接的,以及这对客户端来说到底有多透明。

那么问题来了:如何模拟连接失败并强制 Socket.IO 重新连接?

【问题讨论】:

拔下网线重新插上? 或者可能只是删除任何一方的连接而不关闭它,然后看看另一方的反应。 @xavierm02:这可行,但确实不是您想在单元测试中使用的那种方法 :-) 我如何“删除”连接? 你应该有某种 API 来创建一个对象。并且该对象必须以某种方式具有 close 方法。 Truc 在不使用该 close 方法的情况下删除对象,也许您会遇到错误。如果一方面有错误,那么另一方面会得到你需要的错误。 不,我没有关闭方法,因为连接不打算关闭。即使我这样做了,我也需要在 Socket.IO 级别上进行模拟,因为我希望 Socket.IO 自动重新连接。 【参考方案1】:

Socket.io 在您的 socket 对象 中为您提供事件。实际上,您可以通过阅读他们的 API 找到各种工具。

在***上查看这个例子 Socket.IO handling disconnect event

【讨论】:

【参考方案2】:

根据我的经验,我发现这是最简单和有用的解决方案:

客户端:

// the next 3 functions will be fired automatically on a disconnect.
// the disconnect (the first function) is not required, but you know, 
// you can use it make some other good stuff.

socket.on("disconnect", function() 
  console.log("Disconnected");
);

socket.on("reconnect", function() 
  // do not rejoin from here, since the socket.id token and/or rooms are still
  // not available.
  console.log("Reconnecting");
);

socket.on("connect", function() 
  // thats the key line, now register to the room you want.
  // info about the required rooms (if its not as simple as my 
  // example) could easily be reached via a DB connection. It worth it.
  socket.emit("registerToRoom", $scope.user.phone);
);

服务器端:

io.on('connection', function(socket)
  socket.on("registerToRoom", function(userPhone)    
    socket.join(userPhone);   
  );
);

就是这样。非常简单直接。

您还可以在连接的套接字(最后一个函数)中为用户显示添加更多更新,例如刷新其索引或其他内容。

【讨论】:

以上是关于如何在 Socket.IO 中模拟连接失败的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 连接在生产中失败,在 localhost 中工作

使用 HTTPS 协议的 android 连接中的 Socket.io 客户端失败?

如果连接了 Socket.io,Alamofire 请求总是失败并显示“请求超时”

Android 上的 Socket IO 连接失败

Socket.IO 和 IE8 - jsonp-polling 连接总是失败

客户端和服务器端(React/Node.js)之间的 Socket.io 连接失败