我有一个 socketio 服务器/客户端可以很好地协同工作,但是我想开始为服务器在页面加载或正常运行期间脱机时编写事件。
我在我的头文件中包含了远程 socket.io 代码:
<script src="<?=NODE_HOST?>/socket.io/socket.io.js"></script>
<script>
var nodeHost = '<?=NODE_HOST?>';
</script>
在我的客户端 Controller 中,我有
if(typeof io != '未定义')
this.socket = io.connect(this.settings.server);
别的
this.handleDisconnect();
如果 a) 在正常操作期间发生套接字断开连接,或者 b) 服务器在页面加载时关闭,我必须一遍又一遍地尝试重新连接的功能
botController.prototype.handleDisconnect = function() {
$.getScript(nodeHost+"/socket.io/socket.io.js").done(function(script, textStatus) {
bot.control.socket = io.connect(bot.control.settings.server);
}).失败(功能(jqxhr,设置,异常){
设置超时(函数(){
bot.control.handleDisconnect();
}, 5000);
});
}
我会以正确的方式解决这个问题吗?
我现在遇到的主要问题(这让我创建了这个问题)是服务器关闭时页面加载时的代码错误,因为我有以下功能:
套接字.on(...
当套接字尚不存在时。我可以将它们包装在一个函数中并在成功重新连接时检测到全局套接字对象存在时调用它吗?如果多次调用包含 socket.on... 的函数(如果服务器在操作期间停机不止一次),这是否重要?
好的,我设法提出了这个解决方案,该解决方案似乎使用 yepnope 运行良好,我已经使用 Modernizr(它也为我处理了跨域问题)。
<script src="<?=NODE_HOST?>/socket.io/socket.io.js"></script>
<script>
var nodeHost = '<?=NODE_HOST?>';
</script>
//尝试连接nodejs服务器
botController.prototype.start = function() {
//我们的 nodejs 服务器启动了吗?
if(typeof io != '未定义') {
this.socket = io.connect(this.settings.server);
this.startSocketEvents();
} 别的 {
this.handleDisconnect();
}
}
//我们与服务器的连接已经丢失,我们需要保持
//尝试取回它,直到我们拥有它!
botController.prototype.handleDisconnect = function(destroySocketObject) {
if(destroySocketObject === 未定义)
destroySocketObject = true;
//在再次请求脚本之前销毁任何缓存的 io 对象
如果(销毁套接字对象)
io = 未定义;
yepnope.injectJs(nodeHost+"/socket.io/socket.io.js",
功能(结果){
//它真的下载脚本了吗?
if(typeof io != '未定义') {
bot.control.socket = io.connect(bot.control.settings.server);
bot.control.startSocketEvents();
} 别的 {
设置超时(函数(){
bot.control.handleDisconnect(false);
}, 5000);
}
}
);
其中 startSocketEvents() 函数包含我所有的 socket.on 事件
我是一名优秀的程序员,十分优秀!