2014-11-05 54 views
0

可用对象当ServerClient使用字符串进行通信(使用BufferedReaderPrintWriter类)时,BufferedReader类有一个叫做ready()方法,这意味着有等待客户端抓住和串处理。这种方法也使服务器与2个线程,这是我想要实现的。检查从插座中使用的ObjectInputStream

当使用ObjectInputStreamObjectOutputStream类,OIS类不具有“准备就绪()”方法,代替它具有所谓的“可用的()”,它返回可用的字节数被处理方法。问题是,available()方法返回0,每次和OIS缺乏“准备就绪()”方法使服务器是多线程(线程1为每个连接加上主线程),这不是我想要的。

那么,有没有一种方法来检查Server是否已经“收到”来自ObjectInputStreamSocketObject,而无需创建并保持一个Thread为每个连接?

+1

如果你不希望一个线程每客户端比,使用NIO,它使用一个选择器来查看数据是否可用,或者连接可用。您将'Selector'注册到套接字。然后,您有1个线程检查选择器是否有可用的键。我有一个如何建立一个选择[这里](http://stackoverflow.com/questions/24616774/non-socket-based-java-server/24617983#24617983) – 2014-11-06 00:10:33

+0

@VinceEmigh这是很好的一个例子。我需要看看一些API,但这肯定有帮助。谢谢。 – 2014-11-06 00:17:08

回答

1

有没有一种方法来检查服务器是否通过Socket从ObjectInputStream中“接收”了一个对象,而无需为每个连接创建并保持一个线程?

没有,因为服务器还没有 '从ObjectInputStreamSocket收到Object'。它没有做到这一点直到你打电话readObject().原因ObjectInputStream.available()总是返回零的是,它不会预先知道下一个对象有多大,所以不能判断它是否是所有有或没有,所以它不不骗你,它只是说你可能无法读取任何东西,没有阻止。这没有解决办法。 Selector.select()是没有任何更多的溶液,因为它也不知道下一个对象有多大,更不用说为select()所需的非阻塞模式和用于readObject().

需要阻断模式之间切换的困难使用专用的读取线程。

+0

或者他可以完全忽略java.io,并且保持非阻塞状态(如果允许的话;那就是我的评论所暗示的)。而且也不能反对的大小可以通过一个整洁的协议是accessable?(连载,发送有效载荷,将数据发送) – 2014-11-06 00:54:14

+0

@VinceEmigh他不能完全,如果他想系列化java.io'“疏忽'。 – EJP 2014-11-06 01:07:50

+0

是的,我想要序列化。 – 2014-11-06 13:37:57