检测Web套接字连接丢弃

时间:2012-11-12 02:29:52

标签: windows-8 websocket winjs

在我的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服务器,我的应用程序将不会收到通知,并认为连接仍然存在。 “关闭”事件永远不会触发,似乎没有任何“错误”事件。

有没有办法监控连接状态?

3 个答案:

答案 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...
    }
}