java - 通过 Java NIO 非阻塞 SocketChannel 写入和读取对象

标签 java sockets asynchronous nio nonblocking

我是 Socket 编程新手,我正在尝试编写一个简单的聊天应用程序。我的服务器利用字符串的 HashSet 来存储用户名信息,我想从服务器传递 HashSet给客户。我之前可以通过常规套接字使用 ObjectOutputStreamObjectInputStream 来完成此操作。但是,现在我使用 SocketChannel ,但它不允许这样做,我收到以下异常:

java.nio.channels.IllegalBlockingModeException

所以我在网上搜索了如何做到这一点,每个人都有不同的说法,而且大多数都超出了我的理解范围。有没有一种简单的方法可以做到这一点,而无需完全重写 writeObject 和 readObject 方法?

提前谢谢您。

最佳答案

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

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

关于java - 通过 Java NIO 非阻塞 SocketChannel 写入和读取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42287518/

相关文章:

c - C 中的套接字编程无法在两台不同的 PC 上运行

linux - Linux 中 WSAEvent 的等价物是什么?

spring - Grails @DelegateAsync 和依赖注入(inject)

javascript - 如何将流包装为 async ,使其在启动流之前等待名称解析

Javascript Rest API 在 for 循环中获取调用而不为元素设置值

java - cmd 无法获取正在监听端口 8080 的内容

java - 将流数据发送到icecast

java - 如何识别 Android App 是否正在进行自动化 ui 测试?

java.sql.SQLException : Network error IOException: No route to host?

java - 如何将 Activity.class(this) 传递给方法? (安卓)