线程的Java开销。我应该使用套接字还是套接字通道?

时间:2012-12-27 05:07:06

标签: java multithreading sockets client-server socketchannel

我有一个即时消息程序的设计,我正在用Java编写

第一个想法使用2个单独的线程。第一个线程忽略了gui,并通过写入阻塞套接字发送即时消息数据。第二个线程使用另一个阻塞套接字来监视来自朋友的传入数据包。我不确定使用线程是否是解决此问题的最佳方法,但我发现它比使用非阻塞套接字通道更容易处理。

我的第二个设计是在一个线程中使用非阻塞套接字通道,偶尔会检查是否有传入或传出数据。这个设计的好处是我不必担心线程之间的资源共享,但我不确定它是否更有效。

老实说,我真正关心的是制作一个平稳有效的程序。您认为构建更高效,更容易的设计是什么?我只是在玩,所以我没有建立高效和强大的客户端/服务器程序的经验,而不是我的感官告诉我的。

2 个答案:

答案 0 :(得分:5)

很久以前我制作了一个软件,它有一个带有TCP / IP:套接字的聊天模块。

在每个客户端的开头,它是2个Thread:ReaderThread和WriterThread。它不够,因为客户端断开连接。我也需要创建一个InactivityChecker线程,因为读者无法检测到服务器端的断开连接,而只有当他有消息时才能检测到写入器。 3线程/客户端有点浪费资源,但它可以同时达到5000个客户端! - 会通过上下文切换吃你的处理器!还必须注意打开的最大端口号。

如果您想允许超过65525/2个客户"同时"由于技术原因,异步方式是唯一要去的方式。

答案 1 :(得分:2)

你正在写一个聊天程序,不是吗?在这种情况下,广告收到的数据量非常小,您不应该关心效率。这样做更容易编程。我会选择直接在UI线程中发送数据(写入延迟不应该很大)并在单独的线程中读取数据,然后使用众所周知的方法将接收到的数据发送到UI线程。在两个方向上,使用普通阻塞套接字是最简单的方法。