繁体   English   中英

创建套接字连接后,JFrame被阻止

[英]JFrame blocked after creating socket connection

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

  1. 我认为我的问题是套接字应该放在自己的线程中,但是我已经看到了其他解决方案,并且看到它们没有实现线程,或者至少在它们显示的代码中没有实现。

  2. 也许我的套接字连接实现不正确。

¿如果使用PrintStream是错误的,是否仍然可以使用此类继续练习,我应该使用哪个Stream类? 考虑到我明白,如果需要效率,bufferedStreams是必经之路

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

阻塞此线程的所有内容都将阻止EDT处理新事件,并从本质上使您的应用程序看起来像已挂起。

看看Swing中的并发了解更多详细信息...

要将呼叫initServerConnectoractionPerformed的方法Messenger_Controller类创建一个新的Conector这是创建ServerSocket ,并要求accept它,这是一个阻塞方法。 这将阻止EDT处理新事件,直到它返回为止。

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

有关更多详细信息,请参见工作线程和SwingWorker

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

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

您可以在EDT(事件调度线程)中创建套接字并处理网络流量,因为这是在ActionListener 该线程用于绘制应用程序的GUI并处理与用户的交互。

您不应在EDT中执行冗长的任务,而应为它们启动一个新线程。

如果您确定保留GUI线程进行套接字通信,那么这肯定会阻塞您的线程(UI)。

所需要的是某种异步或非阻塞方式进行套接字通信,该方式不会阻塞您的GUI线程。

保持GUI线程独立运行,并通过创建FutureTaskForkJoinTaskThread或无阻塞套接字通信建立套接字连接,该套接字通信在收到通信消息ForkJoinTask会更新。

创建非阻塞套接字的示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM