所以我正在制作一个应用程序,当我按下启动按钮时它会启动服务器。我是 Java 网络新手,所以服务器非常基础。当我尝试启动服务器时,应用程序卡住。我知道我必须使用多线程来解决它,但我不知道如何多线程。以下是开始按钮事件的一小段代码:
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == startButton) {
appendToChat("CONSOLE > Trying to start server...");
server = new Server(4454);
inputField.setEditable(true);
stopButton.setEnabled(true);
startButton.setEnabled(false);
}
这是来自服务器的代码:
public class Server {
private ServerSocket serverSocket;
private Socket socket;
private Scanner scanner;
private PrintStream stream;
private int port;
private boolean succes = false;
public Server(int port) {
this.port = port;
init();
}
public void sendToClient(String value) {
stream.println(value);
}
public String getMessage() {
if(scanner == null) {
return "reader NullPointerException";
}
return scanner.nextLine();
}
public int getPort() {
return port;
}
public void stop() {
try {
serverSocket.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
scanner.close();
stream.close();
}
public boolean isSucces() {
return succes;
}
private void init() {
try {
serverSocket = new ServerSocket(port);
socket = serverSocket.accept();
scanner = new Scanner(socket.getInputStream());
stream = new PrintStream(socket.getOutputStream());
succes = true;
} catch (Exception e) {
succes = false;
e.printStackTrace();
}
}
}
最佳答案
您的问题是您在调用 ServerSocket.accept() 时阻塞了 UI 线程。您需要在单独的线程上调用它,以便 UI 线程可以继续其操作。
将 init() 方法代码更改为内部 Runnable 类,并在 init() 中运行它
private void init() {
new Thread(new SocketRunner()).start();
}
private class SocketRunner implements Runnabled {
public void run() {
try {
serverSocket = new ServerSocket(port);
socket = serverSocket.accept();
scanner = new Scanner(socket.getInputStream());
stream = new PrintStream(socket.getOutputStream());
succes = true;
} catch (Exception e) {
succes = false;
e.printStackTrace();
}
}
}
关于java - 从 swing 中的事件处理程序启动服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39710626/