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

标签 java

我目前在运行我正在开发的这个小型战舰程序时遇到一些问题。我有两个 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/

相关文章:

java - 重定向过滤器不会加载样式

java - 根据子文档值查找父文档

java - JPA - 从连接的表中检索信息

java - 即使设置了 tempLocation 和 gcpTempLocation,数据流作业也始终会创建新的默认存储桶?

java - 无法在 Java/C++ 中为外部应用程序设置永远在线

java - 如何在 Android 上对 SQLite 的结果进行排序?

java - ProGuard 和 HoloEverywhere : Export Signed Application Errors

java 我可以在一行中创建一个定义为空的字符串吗?

java - equals() 给我空指针异常

java 双除法与 BigDecimal 轮 half_up half_down