0

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

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

4

3 回答 3

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
}
于 2012-11-18T09:35:07.800 回答
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);
}

如果 web 服务器一开始没有运行,onclose 事件会立即触发,或者在终止服务器时触发。

于 2012-11-13T00:43:26.287 回答
0

感谢您提供此信息 - 非常奇怪为什么套接字不引发关闭事件,但它工作得很好。

为 C# 开发人员提供的另一个信息:要确定正确的异常错误状态,您必须调用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...
    }
}
于 2013-02-05T12:11:57.653 回答