java从swing中的事件处理程序启动服务器
所以我正在制作一个应用程序,当我按下开始按钮时,它会启动服务器。我是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();
}
}
}
# 1 楼答案
您的问题是在调用ServerSocket时阻塞了UI线程。接受()。您需要在单独的线程上调用它,以便UI线程可以继续其操作
将init()方法代码更改为内部可运行类,并在init()中运行该类