gpt4 book ai didi

java - 等待客户端答复时 GUI 卡住

转载 作者:行者123 更新时间:2023-12-02 01:32:06 25 4
gpt4 key购买 nike

我目前在运行我正在开发的这个小型战舰程序时遇到一些问题。我有两个 GUI,一个用于服务器,一个用于客户端。当我单击“启动服务器”jButton 时,程序将卡住,直到从客户端接收到某些内容。

GUI 图像(如果有帮助):

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com