2015-10-06 106 views
1

目前,我有我们开发一个Java德州应用项目上的客户端。当然,这个应用程序基于一个客户端服务器套接字系统。我在ArrayList中保存所有加入的客户端(我使用socketServer.accept()方法获取它们)。目前,我为每个加入的客户端创建一个线程,永久检查客户端是否向服务器发送任何数据。我的同学告诉我,这将是更好的方式,如果我创建一个线程大,这在整个客户端ArrayList迭代,并检查每一个客户端inputstreamreader。我应该相信他吗?高性能多线程与插座

+0

你不能让所有插座输入1个线程读取流。如果您使用的是阻塞插座,作为第一个读取调用将阻塞,直到该客户端作为发送的数据,这意味着你会从其他流读取阻塞线程。但是,您可以切换到非阻塞实现,然后处理单个线程上的所有读/写操作(即使您愿意,也可以在同一线程上接受连接)。看看[这个答案](http://stackoverflow.com/a/24617983/2398375) –

+0

你的英语很好。回答你的问题,让我们从电影报价拉。你相信他吗?你的心告诉你什么?如果答案是肯定的,那就去做吧。如果没有,那么研究/做你的两个方法来建立你的信心,并证明你的情况。当怀疑信任代码时,不是人。至少在作为开发者的范围内 –

+0

使用netty http://netty.io/ –

回答

1

创建每个插槽一个线程是不是一个好主意,如果你的应用程序将有很多客户。

我建议为寻找到外部库,以及如何他们处理connonections。例如:http://netty.io/https://mina.apache.org/

+0

感谢您的回答。我会看看这些外部库。 –

1

两种方法都是不可行的。每个连接有一个线程将快速耗尽任何加载系统中的资源。让一个线程ping一个循环中的所有连接将会产生可怕的性能。我们可以使用select()变体 - 在Java中可用的所有套接字 - 具有合理的线程数(16个,为什么不),在这16个线程之间分配所有套接字并在这些套接字上多路复用为了这。