0

こんにちはみんな私はパケットを受信して​​いて正常に動作しているマルチキャストソケットを持っています。

コンピュータがスリープから復帰したときにマルチキャストソケットが機能しないという問題がありました。継続的にタイムアウトします:

MulticastSocket socket;
\\initialise socket..
while (running) {
try {
    synchronized (syncRoot) {
        socket.setSoTimeout(WAIT_TIME);
        socket.receive(recv);
        //Do Something...
    }
} catch (SocketTimeoutException e) {
}

現在、コンピュータがWindowsのスリープモードから復帰すると、パケットが送信されていないときにソケット例外がスローされ続けます。変数socket.isBound()、socket.isClosed()、socket.isConnected()を確認しましたが、動作していたときから変更されていません。変数がありませんか?ソケットが機能している場合でも、isConnected()= false、isBound()= true、isClosed()=falseを返します。

10を取得した場合にSocketTimeoutExceptionsの数をカウントしてから、マルチキャストソケットを再初期化するなどの操作を行う必要がありますか?

4

1 に答える 1

0

そのため、マルチキャストソケットが送受信するときに、送信したばかりのパケットを10秒以内に受信しない場合は、そこにチェックを入れてから、ソケット接続を再開することにしました。これはうまくいきました。

回答の更新:2012/09/06

あなたが言ったように、EJBは接続がありませんが、Windowsがスリープ状態になると、ネットワークアダプタなどがオフになります(100%確実ではありませんが、ソケットは機能しなくなりますが、すべてのコード値はまだアクティブであると言っています)。しかし、スリープ状態から起動したときにコードが行うことは、マルチキャストソケットがまだ接続されていると見なすため、リッスンを続けても問題ありませんが、何も受信しません。実際、例外をスローせずにマルチソケットでデータを送信することもできます。

したがって、この修正はすべての人に最適というわけではありませんが、1つのマルチソケットアドレスでデータを送受信していたため、基本的に、送信されたパケットが10秒以内に受信されない場合は、問題が発生したと見なして接続を再開します。これが私がそれをどのようにしたかを説明するコードの抜粋です:

MulticastSocket socket;
\\initialise socket..
while (running) {
try {
    synchronized (syncRoot) {
    if (sendMessagesQueue.size() > 0) {
        lastOutBoundMessage = sendMessagesQueue.remove();
        byte[] msg = lastOutBoundMessage.toByte();
        DatagramPacket outboundPacket = new DatagramPacket(
            msg, msg.length, group,
            socket.getLocalPort());
        synchronized (syncRoot) {
            socket.send(outboundPacket);
            lastSentMessage = DateTime.now();
        }

        socket.setSoTimeout(WAIT_TIME);
        socket.receive(recv);

        // Compare lastOutBoundMessage  and recv
        // if same set values to null
        // lastSentMessage = null;
        // lastOutBoundMessage = null;
    }
} catch (SocketTimeoutException e) {
    if (lastSentMessage != null && lastSentMessage.plusSeconds(10).isBeforeNow()) {
        running = false;
        // restart thread so connection will start again.
    }
}
于 2012-08-14T22:52:22.857 に答える