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

これは特定のWindows8の質問ですか?私はWindows7、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イベントは、Webサーバーが最初から実行されていない場合にすぐに発生するか、サーバーの強制終了時に発生します。

于 2012-11-13T00:43:26.287 に答える
0

この情報をありがとう-ソケットがクローズドイベントを発生させないのは本当に奇妙ですが、うまく機能します。

C# 開発者向けのもう 1 つの情報: 正しい例外エラー ステータスを判断するには、 SocketError .GetStatus(hresult) メソッドの代わりにWebSocketError .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 に答える