所以我一直在尝试了解套接字,并尝试创建一个简单的聊天应用程序,其中我有 2 个 JFrames 并且每个都连接到套接字,问题是每次我运行JFrame
框架正确启动,但是当我单击 connect_button
时,套接字开始连接,但不允许我继续操作,从现在开始一切都被阻止,我一直在努力理解但我被困在这里,有什么想法吗?
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.
maybe my socket connection is implemented incorrectly.
¿使用PrintStream
是错误的吗?如果是这样,是否仍然可以使用此类来继续此练习以及我应该使用哪个Stream
类?考虑到我知道如果你想要效率,bufferedStreams 是最好的选择
最佳答案
Swing 不是线程安全的。也就是说,所有 UI 事件都发生在事件调度线程的上下文中,包括绘制事件。
任何阻塞该线程的行为都会阻止 EDT 处理新事件,并实质上使您的应用程序看起来像是挂起的。
看看Concurrency in Swing了解更多详情...
在 Messenger_Controller
类的 actionPerformed
方法中调用 initServerConnector
会创建一个新的 Conector
,它是创建一个ServerSocket
并对其调用accept
,这是一个阻塞方法。这会阻止 EDT 在返回之前处理新事件。
相反,您应该使用 SwingWorker
或 Thread
来管理 Socket
连接和通信。
参见Worker Threads and SwingWorker了解更多详情。
也不应该从 EDT 上下文之外更新 Swing 组件。这意味着,如果您在处理套接字通信时需要对 UI 进行更改,则需要将这些更新同步回 UI。
如果您使用的是 SwingWorker
,则可以使用 publish
/process
方法,否则您需要使用 SwingUtilities .invokeLater
,这两种方法都会将调用同步回 EDT,您可以在其中安全地进行更改...
关于java - 创建套接字连接后 JFrame 被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25419941/