有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    您的问题是在调用ServerSocket时阻塞了UI线程。接受()。您需要在单独的线程上调用它,以便UI线程可以继续其操作

    将init()方法代码更改为内部可运行类,并在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();
          }
        }
    }