如何在 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 请求总是失败并显示“请求超时”