0

インターフェイスを実装する UDP サーバー クラスがありRunnableます。スレッドで開始します。問題は、私がそれを止めることができないということです。デバッグでもpt.join()メソッドで停止します。

これが私のサーバークラスです

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;


public class Network implements Runnable {
final int port = 6789;

DatagramSocket socket;

byte[] input = new byte[1024];
byte[] output = new byte[1024];

public Network() throws SocketException{
    socket = new DatagramSocket(6789);
}

@Override
public void run() {
    while(true){
        DatagramPacket pack = new DatagramPacket(input,input.length);
        try {
            socket.receive(pack);
        } catch (IOException e) {
            e.printStackTrace();
        }
        input = pack.getData();
        System.out.println(new String(input));
        output = "Server answer".getBytes();
        DatagramPacket sendpack = new DatagramPacket(output,output.length,pack.getAddress(),pack.getPort());
        try {
            socket.send(sendpack);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
}

これがメインクラス

public class Main {

static Network network = null;

public static void main(String[] args) throws IOException{
    network = new Network();
    System.out.println("Try to start server");
    Thread pt = new Thread(network);
    pt.start();

    pt.interrupt();
    try {
        pt.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    System.out.println("Stop server");
}
}

サーバーを停止するには?

4

3 に答える 3

2

java.net の読み取りは中断できません。を閉じるかDatagramSocket、タイムアウト ( setSoTimeout()) で読み取る必要があります。結果が得られたらSocketTimeoutException、割り込みステータスを確認します。設定されている場合は、スレッドを終了します。

于 2013-02-11T23:40:53.357 に答える
1

呼び出しinterruptは実際にスレッドを停止するのではなく、フラグを設定するだけです。

ループ内で、 を確認してくださいisInterrupted()。たとえば、迅速で汚い方法は変更になります

while(true) 
to 
while (!Thread.currentThread().isInterrupted())

しかし、このプロジェクトについてもっと真剣に考えている場合は、さらにいくつかのドキュメントを参照する必要があります。

@EJP で述べたように、ソケット IO でハングしている場合は、ソケットを閉じるか、タイムアウトする必要があります。

于 2013-02-11T23:44:08.823 に答える
1

EJP が言ったことに加えて、running (または何でも) という名前のローカル ブール値を用意し、while ループに入る前にそれを true に設定する必要があります。while ループをこのローカル ブール値で条件付けます。また、ブール値のステータスを設定および確認するためのメソッド (stopServer() および isRunning()) を提供します。また、while ループ内から try-catch を削除し、while ループ全体を try-catch-finally 内に配置して、finally ステートメントでクリーンアップを実行することもできます (running=false を設定、接続を閉じるなど)。

于 2013-02-11T23:46:31.437 に答える