【问题标题】:how can i make this dialog close when socket is accepted?接受套接字时如何关闭此对话框?
【发布时间】:2015-11-23 18:19:30
【问题描述】:

所以我正在开发一个带有套接字的游戏,目前我得到了这个:

public void waitconnection() throws IOException {
    try {
         InetAddress address= InetAddress.getLocalHost();

        final JOptionPane optionPane = new JOptionPane("IP Hosting " + direccion + " \nPuerto:5000", JOptionPane.INFORMATION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, new Object[]{}, null);
        final JDialog dialog = new JDialog();
        dialog.setTitle("Esperando conexion...");
        dialog.setModal(true);
        dialog.setContentPane(optionPane);
        dialog.setLocationRelativeTo(pServidor);
        dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
    } catch (UnknownHostException ex) {
        Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
    }
    conexion = servidor.accept();

    conexion.getInetAddress().getHostAddress();//acepta el socket y guarda la ip
}

我希望对话窗口在找到来自客户端的连接时关闭,我怎样才能使窗口在达到连接时关闭并继续执行代码?

在添加该代码之前,我有这个:

public void waitconnection() throws IOException {
    try {
        InetAddress direccion = InetAddress.getLocalHost();
        JOptionPane.showMessageDialog(null, "IP Hosting " + direccion + " Puerto:5000", "Esperando conexión", JOptionPane.INFORMATION_MESSAGE);
    } catch (UnknownHostException ex) {
        Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
    }
    conexion = servidor.accept();

    conexion.getInetAddress().getHostAddress();
}

所以当我点击确定时,连接已设置,游戏将在 2 台计算机上执行。

【问题讨论】:

    标签: java swing sockets network-programming jdialog


    【解决方案1】:

    您的服务器套接字代码的变量很难阅读,我在下面的代码中以一般方式命名(相应调整)。你需要写一个方法写成closeDialog()[或者给一个更好的名字];并首先调用构造函数,然后调用此方法并关闭 JDialog。

    此外,您需要将 JDialog 的范围扩展到类,而不是通过在类范围中声明方法 waitConnection()

    这段代码是如何工作的?

    Socket accept() 是一种阻塞方法,除非建立连接,否则不会执行;否则会发生套接字超时。您可以删除超时部分,这只是一个示例。因此,一旦客户端连接到服务器套接字,就会执行下一条语句,该语句将处理 JDialog。

    * 顺便说一句,我对 Java Swing 的想法很少,也许有更好的方法来关闭 JDialog,但我对这个有想法。它应该可以工作。

    你的代码应该是这样的:-

    public class Server
    {
    private ServerSocket serverSocket;
    
    public Server(int port) throws IOException
    {
      serverSocket = new ServerSocket(port);
      // optional timeout part depending on your application.
      serverSocket.setSoTimeout(10000);
    }
    
    public closeDialog(){
    try{
    Socket server = serverSocket.accept();
    dialog.dispose();
    // Rest of your code
    }
    catch(SocketTimeoutException s)
         {
            System.out.println("Socket timed out!");
         }catch(IOException e)
         {
            e.printStackTrace();
         }
      }
    // Rest of your code
    }
    

    【讨论】:

    • 感谢您抽出宝贵时间,我尝试了您上面描述的方法,但没有成功,我意识到我的游戏在找到连接之前会崩溃,所以这可能是没有响应的原因你的方法。无论如何,我会留下它,我想出了一个替代方案,它不那么专业,但它有效。
    • @DanielEstebanLadinoTorres - 我不认为崩溃的原因是我的方法的行为,我当然怀疑你的 Swing 代码中的问题!但是,无论如何,我很高兴它成功了。
    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多