Закрыть UDP-сервер без исключения - PullRequest
0 голосов
/ 23 апреля 2019

На самом деле я пишу код, где я должен использовать сервер UDP.В течение срока действия моего приложения я должен закрыть этот сервер и иметь возможность открыть его позже.Проблема в том, что сервер находится в состоянии прослушивания, поэтому я принудительно закрываю его, закрывая сокет сервера преждевременно.Это исключение показано:

java.net.SocketException: Socket closed
    at java.net.PlainDatagramSocketImpl.receive0(Native Method)
    at java.net.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:143)
    at java.net.DatagramSocket.receive(DatagramSocket.java:812)
    at test.UdpServer.run(UdpServer.java:21)
    at java.lang.Thread.run(Thread.java:748)

Вот мой MCVE:

main:

package test;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class test {

    private static Thread server, display;
    private static UdpServer udpServer = new UdpServer();

    public static void main(String args[]){

        display = new Thread() {
            public void run() {
                JFrame frame = new JFrame();
                JPanel panel = new JPanel();
                JButton start = new JButton("start");
                JButton stop = new JButton("stop");

                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLocationRelativeTo(null);

                panel.add(start);
                panel.add(stop);

                frame.setContentPane(panel);

                start.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        server = new Thread(udpServer);
                        server.start();
                    }
                });

                stop.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        udpServer.stopReception();
                    }
                });

                frame.pack();
                frame.setVisible(true);
            }
        };
        display.start();
    }
}

server:

package test;

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

public class UdpServer implements Runnable {

    private boolean run;
    private DatagramSocket serverSocket;

    public void run() {
        run = true;

        try {
            serverSocket = new DatagramSocket(8000);
            byte[] receiveData = new byte[1024];
            while(run){
                System.out.println("Waiting for command : ");
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                serverSocket.receive(receivePacket);
                if(run) {
                    receiveData = receivePacket.getData();
                    String message = new String (receivePacket.getData());

                    System.out.println(message);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void stopReception() {
        run = false;
        serverSocket.close();
    }
}

I'mпроделал некоторую повторную проверку и нашел этот поток , но я не понял, что объясняет user207421 о

Отключите их для ввода.

Итак, мои вопросы: как заставить мой сокет закрыться, не выдавая исключений?

Действительно ли проблема выбросить это исключение?Потому что на жизнь моего приложения это не влияет, и сервер может быть вновь открыт после этого.

...