2

私はクライアントサーバープログラムを実装しており、サーバーからのACK応答なしで5秒間待機した後、クライアントが同じパケットを送り返すことを望んでいました...

こんな感じで作ったので良かったら教えてください..

dp = new DatagramPacket(packet , packet.length , host , port);
        sock.send(dp);
        time = System.currentTimeMillis();
        while ((System.currentTimeMillis() - time < 5000) && ack_dp.getLength() == 0) {
            sock.receive(ack_dp);
        }

        if (ack_dp.getLength() == 0)
            sock.send(dp);

したがって、私のプログラムは ACK を 5 秒間待機し、何も受信しない場合、同じパケットを再送信します。彼が ack を受信したかどうかをパケット長でチェックします.. 0 のままの場合、彼は何も受信していません.. 0 より長くなる場合は、while シーケンスを終了して、新しいパケットを送信します.. ( ps: ack_dp は 2 バイトです)

4

1 に答える 1

5

receive()ソケット上ではデフォルトでブロックされるため、ここではループは意味がありません (ソケットが非ブロックに設定されていたとしても、99.99% のケースでビジー待機するのは悪い考えTMです)。

setSoTimeout()、およびキャッチSocketTimeoutExceptionを代わりに使用してください。

于 2012-12-14T19:27:59.687 に答える