java - 创建套接字连接后 JFrame 被阻止

标签 java swing sockets

所以我一直在尝试了解套接字,并尝试创建一个简单的聊天应用程序,其中我有 2 个 JFrames 并且每个都连接到套接字,问题是每次我运行JFrame 框架正确启动,但是当我单击 connect_button 时,套接字开始连接,但不允许我继续操作,从现在开始一切都被阻止,我一直在努力理解但我被困在这里,有什么想法吗?

  1. i think my problem is that the sockets should go in their own Threads, but i've seen other solutions and seen that they don't implement Threads, or at least in the code that they show.

  2. maybe my socket connection is implemented incorrectly.

¿使用PrintStream是错误的吗?如果是这样,是否仍然可以使用此类来继续此练习以及我应该使用哪个Stream类?考虑到我知道如果你想要效率,bufferedStreams 是最好的选择

最佳答案

Swing 不是线程安全的。也就是说,所有 UI 事件都发生在事件调度线程的上下文中,包括绘制事件。

任何阻塞该线程的行为都会阻止 EDT 处理新事件,并实质上使您的应用程序看起来像是挂起的。

看看Concurrency in Swing了解更多详情...

Messenger_Controller 类的 actionPerformed 方法中调用 initServerConnector 会创建一个新的 Conector,它是创建一个ServerSocket并对其调用accept,这是一个阻塞方法。这会阻止 EDT 在返回之前处理新事件。

相反,您应该使用 SwingWorkerThread 来管理 Socket 连接和通信。

参见Worker Threads and SwingWorker了解更多详情。

也不应该从 EDT 上下文之外更新 Swing 组件。这意味着,如果您在处理套接字通信时需要对 UI 进行更改,则需要将这些更新同步回 UI。

如果您使用的是 SwingWorker,则可以使用 publish/process 方法,否则您需要使用 SwingUtilities .invokeLater,这两种方法都会将调用同步回 EDT,您可以在其中安全地进行更改...

关于java - 创建套接字连接后 JFrame 被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25419941/

相关文章:

java - 使用 mule 安装 Maven 错误,jdk 中找不到 com.sun.tools.jar

c++ - 发送UDP包时"Invalid argument",但是哪个呢?

xml - XML over Sockets 是好的还是坏的做法?

java - 一个 JPanel 中存在多个 JComboBox

java - SwingWorker:何时调用 done 方法?

java - 由 JPanel 实现时,MouseEvent 不会触发

c# - 是否可以从 C# 客户端连接到 nanomsg 套接字?

java - 如何使用不同的数据类型进行交换

java - 创建唯一的消息 ID,例如 Whatsapp

java - 在 Java Spring MVC 中的所有(或大部分) Controller 中进行相同的方法调用并设置属性