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

Java 从swing中的事件处理程序启动服务器,java,multithreading,swing,server,event-handling,Java,Multithreading,Swing,Server,Event Handling,因此,我正在制作一个应用程序,当我按下开始按钮时,它会启动服务器。我是Java网络新手,所以服务器非常基础。当我尝试启动服务器时,应用程序冻结。我知道我必须使用多线程来解决它,但我不知道如何使用多线程。下面是“开始”按钮事件的一个小代码片段: @Override public void actionPerformed(ActionEvent e) { if(e.getSource() == startButton) {

因此,我正在制作一个应用程序,当我按下开始按钮时,它会启动服务器。我是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();
    }

}

 }

应用程序冻结,因为在4454端口中等待请求。因此,您必须在不同的线程中启动服务器。代码更新

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == startButton) {

            appendToChat("CONSOLE > Trying to start server...");

            new Thread(new Runnable() {
                @Override
                public void run() {
                    server = new Server(4454);
                }
            }).start();


            inputField.setEditable(true);
            stopButton.setEnabled(true);
            startButton.setEnabled(false);
        }

应用程序冻结,因为在4454端口中等待请求。因此,您必须在不同的线程中启动服务器。代码更新

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == startButton) {

            appendToChat("CONSOLE > Trying to start server...");

            new Thread(new Runnable() {
                @Override
                public void run() {
                    server = new Server(4454);
                }
            }).start();


            inputField.setEditable(true);
            stopButton.setEnabled(true);
            startButton.setEnabled(false);
        }

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

将init()方法代码更改为内部可运行类,并在init()中运行该类


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

将init()方法代码更改为内部可运行类,并在init()中运行该类


您的程序正在冻结,因为服务器开始侦听是否有它可以接受的客户端。我建议您的
服务器
类扩展
线程
。您需要实现
run()
函数,该函数应包含
init()
方法和带有
getMessage()
函数的无限循环。创建
服务器
对象后,必须调用
start()
方法

public class Server extends Thread {

    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;   
    }

    @Override
    public void run() {
        init();
        while(true) {
            getMessage();
        }
    }

    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 disconnect() {
        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();
        }
    }
}
以及
actionPerformed()
函数:

 @Override
 public void actionPerformed(ActionEvent e) {
    if(e.getSource() == startButton) {

        appendToChat("CONSOLE > Trying to start server...");
        server = new Server(4454);
        server.start();

        inputField.setEditable(true);
        stopButton.setEnabled(true);
        startButton.setEnabled(false);
    }

您的程序正在冻结,因为服务器开始侦听是否有它可以接受的客户端。我建议您的
服务器
类扩展
线程
。您需要实现
run()
函数,该函数应包含
init()
方法和带有
getMessage()
函数的无限循环。创建
服务器
对象后,必须调用
start()
方法

public class Server extends Thread {

    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;   
    }

    @Override
    public void run() {
        init();
        while(true) {
            getMessage();
        }
    }

    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 disconnect() {
        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();
        }
    }
}
以及
actionPerformed()
函数:

 @Override
 public void actionPerformed(ActionEvent e) {
    if(e.getSource() == startButton) {

        appendToChat("CONSOLE > Trying to start server...");
        server = new Server(4454);
        server.start();

        inputField.setEditable(true);
        stopButton.setEnabled(true);
        startButton.setEnabled(false);
    }