0

我有一个实现Runnable接口的 UDP 服务器类。我在线程中启动它。问题是我无法阻止它。即使在 Debug 中,它也会停止在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 所提到的,如果您挂在 Socket IO 中,则需要关闭 Socket 或超时。

于 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 回答