На самом деле я пишу код, где я должен использовать сервер 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 о
Отключите их для ввода.
Итак, мои вопросы: как заставить мой сокет закрыться, не выдавая исключений?
Действительно ли проблема выбросить это исключение?Потому что на жизнь моего приложения это не влияет, и сервер может быть вновь открыт после этого.