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();
}

该类扩展了 Thread。

4

3 回答 3

6

socket.receive is a blocking method. So the code is waiting on receive untill you receive any data.

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