【问题标题】:Have ServerSocket accepting connection, want to close dialog when connected有 ServerSocket 接受连接,连接时要关闭对话框
【发布时间】:2012-09-18 05:49:23
【问题描述】:

我设置了一个简单的服务器-客户端程序。用户开始侦听连接,并出现一个对话框,其中包含消息“正在侦听连接”和一个取消按钮。如果他点击取消,服务器套接字将关闭。没关系。

我想要的是在建立连接时让“正在侦听...”对话框消失。

目前 ListenDialog 是可运行的,因为我尝试将 accept() 放在那里,或者 while(true), if socket != null, dispose();... 没有任何效果。对话框设置为模态,否则accept() 块和对话框 GUI(即取消按钮)永远不会被绘制;即使run() 方法在accept() 停止阻塞之前也不会运行,即使它看起来应该在单独的线程中。

所以,我可以通过将dispose() 放入对话框的run() 方法并使对话框非模态来获得我想要的关闭功能......但它永远不会绘制GUI,所以取消按钮不能使用。我可以通过使对话框模态来获取我的 GUI 和取消按钮,但即使在 accept() 停止阻止 run() 方法似乎没有做任何事情之后(即对话框只是坐在那里直到手动关闭,甚至不是 @ 987654330@ 代码播放完毕。)

请告诉我,我缺少一些明显的东西!

ListenDialog listener = new ListenDialog();

Thread listenThread = new Thread(listener);
listenThread.start();

try {
    socket = server.accept();
    listener.dispose();
} catch(IOException e1) {
    addMessage("Accept Failed: " + e1.getMessage());
}

【问题讨论】:

  • 如果listenThread 只使用监听器,为什么不直接在绑定套接字后将其杀死?
  • 您是否尝试过使用 AsyncTask 或类似的东西?我猜你不应该接受 gui 线程上的套接字......

标签: java multithreading sockets runnable


【解决方案1】:

好吧,我不是 100% 确定这个解决方案是如何工作的,或者与我尝试过的其他任何事情的重要区别是什么......但就是这样。

ListenDialog 的构造函数现在包含为自己创建一个新线程。 run() 方法包含 accept() 调用,后跟 try/catch 块外的 dispose()。上面显示的所有代码(除了创建新的ListenDialog)都已移至ListenDialog 类中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 2015-05-15
    • 2011-01-23
    相关资源
    最近更新 更多