在我的Windows 8 JS应用程序中,我有一个像这样定义的Web套接字对象:
var webSocket = new Windows.Networking.Sockets.MessageWebSocket();
webSocket.control.messageType = Windows.Networking.Sockets.SocketMessageType.utf8;
webSocket.onmessagereceived = that._onMessageReceived;
webSocket.onclosed = that._onClosed;
我使用webSocket.connectAsync(uri).done(/* ... */)
进行连接,该部分工作正常。
如果我在另一端停止我的Web服务器,我的应用程序将不会收到通知,并认为连接仍然存在。 “关闭”事件永远不会触发,似乎没有任何“错误”事件。
有没有办法监控连接状态?
答案 0 :(得分:1)
想出来。 messagereceived事件实际上在连接失败时触发。在处理程序内部,您可以在数据读取器操作周围使用try catch块。
try {
var dataReader = args.getDataReader();
var msg = dataReader.readString(dataReader.unconsumedBufferLength);
} catch (ex) {
var error = Windows.Networking.Sockets.SocketError.getStatus(ex.number);
// do something
}
答案 1 :(得分:0)
这是一个特定的Windows 8问题吗?我测试了以下内容,以便在Windows 7,OSX和Ubuntu上工作(使用相当新版本的Firefox,Safari和Chrome):
var s = new WebSocket("ws://"+window.location.hostname+":9876");
s.onopen = function(e) {
console.log("opened socket for unidrive log");
}
s.onclose = function(e) {
console.log("closed");
}
s.onmessage = function(e) {
console.log("got message: " + e.data);
}
如果网络服务器没有开始运行,则会立即触发onclose事件,或者在终止服务器时触发。
答案 2 :(得分:0)
感谢您提供此信息 - 真的很奇怪为什么套接字不会引发闭合事件,但效果很好。
C#开发人员的另一个信息:要确定正确的异常 - errorstatus,你必须调用 WebSocketError .GetStatus(hresult)而不是 SocketError .GetStatus( hresult)方法。
try
{
using (DataReader reader = e.GetDataReader())
{
reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
string rawMessage = reader.ReadString(reader.UnconsumedBufferLength);
// Do something with the message...
}
}
catch (Exception ex)
{
var errorStatus = Windows.Networking.Sockets.WebSocketError.GetStatus(ex.HResult);
if (errorStatus == WebErrorStatus.ConnectionAborted)
{
// Handle the connection-abort...
}
}