2017-02-17 54 views
0

我是新来的Socket编程,我正在尝试编写一个简单的聊天应用程序。我的服务器利用字符串HashSet来存储用户名信息,我想通过HashSet从服务器到客户端。我可以在ObjectOutputStreamObjectInputStream之前通过常规套接字进行此操作。不过,现在我使用SocketChannel并不允许这样做,我得到以下异常:通过Java编写和读取对象NIO非阻塞SocketChannels

java.nio.channels.IllegalBlockingModeException 

所以我搜索了如何做到这一点,大家说了什么不同的网络,大多数走的方式在我的头上。有没有简单的方法来做到这一点,而不是完全覆盖自己的writeObjectreadObject方法?

谢谢您提前。

+0

有可能:这也太难了。坚持阻塞模式。 – EJP

+0

@EJP洛尔谢谢,我需要做到这一点在非阻塞作为我的网络编程类的一部分。 – mks

回答

1

我建议你不要使用非阻塞模式或不要使用序列化。

如果您需要,您需要序列化为ByteArrayOutputStream,获取长度,发送长度,发送字节,接收长度,继续读取,累积数据,直到您获得正确的数据长度,并将其放入一个ByteArrayInputStream,并从中反序列化。不容易,特别是围绕“继续阅读”的挥手。浪费时间和空间。

+0

谢谢,没有人有写在某处的通用模板?你会认为这是一个普遍问题。 – mks

+0

这个问题之前已经在这里问过。 – EJP

+0

我的意思是某种使用Java泛型来处理这个问题的类或方法。 – mks