【问题标题】:Checking for an available Object from Socket using ObjectInputStream使用 ObjectInputStream 检查来自 Socket 的可用对象
【发布时间】:2014-11-05 23:56:30
【问题描述】:

ServerClient使用Strings进行通信时(使用BufferedReaderPrintWriter类),BufferedReader类有一个方法叫ready(),意思是有一个字符串在等待客户端抓取和处理。这种方法也使得服务器成为2线程,这是我想要实现的。

当使用ObjectInputStreamObjectOutputStream 类时,OIS 类没有'ready()' 方法,而是有一个名为'available()' 的方法,它返回可用字节数处理。问题是available() 方法每次都返回 0 并且 OIS 中缺少 'ready()' 方法使服务器成为多线程(每个连接 1 个线程加上主线程),这不是我想要的。

那么,有没有一种方法可以检查 Server 是否从 ObjectInputStream “接收”到 Object 而不是 Socket,而无需为每个连接创建和保存 Thread

【问题讨论】:

  • 如果您不想要每个客户端的线程比率,请使用 NIO,它使用 Selector 来查看数据是否可用或连接是否可用。您将Selector 注册到套接字。然后,您有 1 个线程检查选择器中的可用键。我有一个如何设置选择器的示例here
  • @VinceEmigh 很好。我需要看一些 API,但这肯定有帮助。谢谢。

标签: java object input stream server


【解决方案1】:

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

不,因为服务器没有'从ObjectInputStream 收到Socket 上的Object'。它不会这样做直到你调用readObject().ObjectInputStream.available()总是返回零的原因是它事先不知道下一个对象有多大,所以它无法判断是否它是否存在,所以它不会骗你,它只是说你可能无法在没有阻塞的情况下阅读任何内容。对此没有解决方案。 Selector.select() 不再是一个解决方案,因为它也不知道下一个对象有多大,更不用说在select() 所需的非阻塞模式和@ 所需的阻塞模式之间切换的难度987654328@

使用专用的读取线程。

【讨论】:

  • 或者他可以完全忽略java.io,并保持非阻塞(如果允许;这就是我的评论所暗示的)。并且不能通过简洁的协议访问对象大小吗?(序列化,发送有效负载,发送数据)
  • @VinceEmigh 如果他想要序列化,他不能完全忽略java.io
  • 是的,伙计们,我确实想要序列化。
猜你喜欢
  • 1970-01-01
  • 2012-08-12
  • 2015-12-21
  • 2011-03-06
  • 2014-01-31
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多