我一直在开发基于浏览器的多人游戏一段时间,我一直在各种环境(客户办公室,公共wifi等)测试不同的端口可访问性.一切都很顺利,除了一件事:我无法弄清楚如何读取错误号.或收到onerror事件时的描述.
客户端websocket是在javascript中完成的.
例如:
// Init of websocket
websocket = new WebSocket(wsUri);
websocket.onerror = OnSocketError;
...etc...
// Handler for onerror:
function OnSocketError(ev)
{
output("Socket error: " + ev.data);
}
Run Code Online (Sandbox Code Playgroud)
'output'只是一些写入div的实用函数.
我得到的是ev.data的'undefined'.总是.我一直在谷歌搜索,但似乎没有关于这个事件有什么参数以及如何正确阅读它的规范.
任何帮助表示赞赏!
假设我有一个以端口启动的节点服务器nn,并且没有任何WebSocket服务.
问题是我的客户端尝试将WebSocket服务连接到此服务器.
显然,它应该无法连接到服务器.
但我无法捕捉到这个错误,我的客户端代码如下:
try {
this.ws = new WebSocket('ws://xxx:nn');
} catch ( e ) {
fallback();
console.warn(e);
}
Run Code Online (Sandbox Code Playgroud)
我的期望是fallback在连接失败时调用方法,但实际上我可以通过上面捕获它的错误try...catch
有谁知道如何在我的用例中捕获错误?
在Firefox(至少)中,如果你按ESC,它将关闭所有打开的WebSockets连接.我需要捕获断开连接并尝试重新连接一旦它再次可用.
这是我试图实现的代码的一个示例,但是我能想出的任何内容都不会捕获错误并允许我优雅地处理它.
看看代码:http://jsfiddle.net/w5aAK/
var url = "ws://echo.websocket.org";
try {
socket = window['MozWebSocket'] ? new MozWebSocket(url) : new WebSocket(url);
socket.onopen = function(){
console.log('Socket is now open.');
};
socket.onerror = function (error) {
console.error('There was an un-identified Web Socket error');
};
socket.onmessage = function (message) {
console.info("Message: %o", message.data);
};
} catch (e) {
console.error('Sorry, the web socket at "%s" is un-available', url);
}
setTimeout(function(){
socket.send("Hello World");
}, 1000);
Run Code Online (Sandbox Code Playgroud)
打开控制台并观察输出.
我在这里做错了,还是因为连接在JS脚本范围之外运行而不可能?
任何输入都会有所帮助.
谢谢!
我编写了一个使用Web套接字的Web应用程序.这个想法是我的应用程序在启动时尝试自动连接到最近连接到主机.如果它无法建立与其中任何一个的连接,则它会将用户定向到连接部分并要求他们手动建立连接.
所有这一切都有效.总之,我按顺序尝试每个已知主机,如果200ms后它没有连接(`readyState!= 1),它会尝试下一个.所有这些主机应该在局域网上,所以200ms工作非常可靠.如果列表中的最后一个也失败,那么Web将打开一个模式,指示用户手动键入主机.
问题是,通过尝试自动连接,我必须为我尝试过的主机创建websockets,它会向控制台输出如下所示的错误消息:
与'ws:// lightmate:8080 /'的WebSocket连接失败:连接建立错误:net :: ERR_NAME_NOT_RESOLVED
与'ws:// localhost:8080 /'的WebSocket连接失败:连接建立错误:net :: ERR_CONNECTION_REFUSED
虽然不是任何方式致命的缺陷,但这是不雅观的,妨碍了我的调试.
我试图通过new WebSocket(address)使用try/catch块包围调用来删除它,并且错误仍然通过,我也尝试设置一个onerror处理程序,希望这会抑制错误消息.什么都没有用.
connect: function(){
var fulladdr = completeServerAddress(address);
try {
connection = new WebSocket(fulladdr);
connection.suppressErrorsBecauseOfAutoConnection = suppressErrorsBecauseOfAutoConnection; //Store this module-scoped variable in connection, so if the module changes suppression state, this connection won't.
} catch (e){
//Make sure we don't try to send anything down this dead websocket
connection = false;
return false;
}
connection.binaryType = "arraybuffer";
connection.onerror = function(){
if …Run Code Online (Sandbox Code Playgroud) 我的网络应用程序需要定期检查服务器是否已启动。这允许用户以任一顺序启动服务器和客户端。
为此,我只是WebSocket从setTimeout处理程序内部调用构造函数。
从使用的角度来看,这种策略效果很好,但对我开发人员来说很烦人,因为我在 Chrome 中看到很多控制台错误:
remote.html:194 WebSocket connection to 'ws://localhost:8082/' failed: Connection closed before receiving a handshake response
remote.html:194 WebSocket connection to 'ws://localhost:8082/' failed: Connection closed before receiving a handshake response
remote.html:194 WebSocket connection to 'ws://localhost:8082/' failed: Connection closed before receiving a handshake response
Run Code Online (Sandbox Code Playgroud)
这些并不是真正的错误,因为我的 Web 应用程序在服务器不可用的情况下完全没问题。它重复调用WebSocket构造函数(MDN)只是为了检查服务器是否已经启动。
有一个更好的方法吗?对于上下文,我的 Web 应用程序是在设备上运行的本机 C++ 应用程序的“远程控制”。