我目前在运行我正在开发的这个小型战舰程序时遇到一些问题。我有两个 GUI,一个用于服务器,一个用于客户端。当我单击“启动服务器”jButton 时,程序将卡住,直到从客户端接收到某些内容。
GUI 图像(如果有帮助):
我通过启动客户端程序来解冻它没有问题,我的问题是,如何才能使它在等待时不会卡住?非常感谢。
package battleship;
import javax.swing.JOptionPane;
import java.io.IOException;
import java.util.Scanner;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
/**
*
* @author ftonye
*/
public class BackGroundCom implements Runnable {
private int port;
private ServerSocket ss;
private Socket cs;
private Scanner reader;
private PrintStream writer;
public int missileIncomming;
public int missileOutgoing;
public Boolean dataToSend;
InetAddress sa = null;
public BackGroundCom(int port) {
this.port = port;
dataToSend = true;
missileOutgoing = 100;
startServer();
}
private void startServer() {
try {
sa = InetAddress.getLocalHost();
System.out.println(sa);
} catch (UnknownHostException ex) {
Logger.getLogger(BackGroundCom.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Server started");
try {
ss = new ServerSocket(this.port);
cs = ss.accept();
JOptionPane.showMessageDialog(null, "Server accept connection from" + cs.getInetAddress().getHostAddress());
} catch (IOException ex) {
JOptionPane.showMessageDialog(null, ex.getMessage());
}
System.out.println("Server accept connection");
}
我的 BattleSea.java 的一部分,这是我在卡住之前单击按钮的位置:
btnStartServer = new JButton("Start Server");
btnStartServer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
com = new BackGroundCom(Integer.parseInt(txtPortNumber.getText().toString()));
t = new Thread(com);
t.start();
}
});
我正在尝试了解如何让它永远不会卡住。谢谢
最佳答案
我预计是调用 cs = ss.accept();
被阻塞。这将阻塞,直到客户端连接到服务器。您运行此命令是为了响应按下按钮,因为在按钮操作代码中,您构造了一个 BackGroundCom
,并且该对象的构造函数调用 startServer
,后者执行此 accept ()
直接一行。
您似乎正在尝试设置 BackGroundCom
对象,以便它所做的事情发生在后台线程中,但我上面描述的所有事情都发生在您创建和运行线程之前。也许您想要做的是将 startServer
调用移至 BackGroundCom
对象的 run()
方法中。我在 BackGroundCom
中没有看到 run()
方法,尽管它实现了 Runnable
。我认为它在代码的更下方。没有它,这段代码甚至无法编译。
关于java - 等待客户端答复时 GUI 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55883192/