java - 从 swing 中的事件处理程序启动服务器

标签 java multithreading swing server event-handling

所以我正在制作一个应用程序,当我按下启动按钮时它会启动服务器。我是 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/

相关文章:

java - 鼠标退出按钮时未触发 MouseExited

java - 了解泛型方法返回类型

java - 线程不同步

c++ - 这个奇怪的 clang 编译错误

java - 将按钮放在图像顶部?

java - JTabbedPane点击事件

java - 如何更改消息框中字符串的颜色?

java - 使用 xml 配置 Jersey RESTFUL

java - 在android中读取Json数组

c# - 模拟页面生命周期从UI层抓取html