Java 从swing中的事件处理程序启动服务器
因此,我正在制作一个应用程序,当我按下开始按钮时,它会启动服务器。我是Java网络新手,所以服务器非常基础。当我尝试启动服务器时,应用程序冻结。我知道我必须使用多线程来解决它,但我不知道如何使用多线程。下面是“开始”按钮事件的一个小代码片段: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) {
@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);
}