0

別のスレッドでサーバーを実行していますが、何らかの理由で、パケットを受信したときにのみ実行されます! なぜこれを行うのですか?継続的に実行する必要はありませんか?

public void run() {
    while (running) {
        System.out.println(true);
        byte[] data = new byte[1024];
        DatagramPacket packet = new DatagramPacket(data, data.length);
        try {
            this.socket.receive(packet);
        } catch (IOException e) {
            e.printStackTrace();
        }
        parsePacket(packet.getData(), packet.getAddress(), packet.getPort());
    }
}

そして、私は次のように始めます:

public static void main(String[] args) {
    GameServer server = new GameServer();
    server.start();
}

このクラスはスレッドを拡張します。

4

3 に答える 3

6

socket.receiveブロッキング方法です。したがって、データを受信するまで、コードは受信を待機しています。

于 2013-11-15T11:00:47.927 に答える
3

スレッドは正しく実行されています。メソッドDatagramSocket.receive(DatagramPacket) は、パケットが受信されるまでブロックします。

デフォルトの動作は、パケットが受信されるまで無限にブロックすることです。DatagramSocket.setSoTimeout(int)パケットが受信されたかどうかを定期的にログに記録する場合、またはスレッドがまだ実行されているかどうかを確認する場合は、 を使用してタイムアウトを指定できます。

于 2013-11-15T11:04:12.483 に答える
3

ここから

public void receive(DatagramPacket p)
             throws IOException

このソケットからデータグラム パケットを受信します。このメソッドが戻ると、DatagramPacket のバッファは受信したデータで満たされます。データグラム パケットには、送信者の IP アドレスと、送信者のマシンのポート番号も含まれています。

このメソッドは、データグラムが受信されるまでブロックします。データグラム パケット オブジェクトの長さフィールドには、受信したメッセージの長さが含まれます。メッセージがパケットの長さよりも長い場合、メッセージは切り捨てられます。

メソッドがデータグラムをブロックして待機することを明確に示しています。

于 2013-11-15T11:03:14.207 に答える