通过Java NIO写入和读取对象非阻塞SocketChannels

时间:2017-02-17 00:55:23

标签: java sockets asynchronous nio nonblocking

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

java.nio.channels.IllegalBlockingModeException

所以我在网上搜索了如何做到这一点,每个人都说了不同的东西,而且大多数都是我的头脑。有没有一种简单的方法可以在不完全覆盖writeObjectreadObject方法的情况下完成此操作?

提前谢谢你。

1 个答案:

答案 0 :(得分:1)

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

如果必须,您需要序列化为<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="container"> <label for="text-area">Paste your code here: </label> <form method="post" > <textarea name="code_input" id="code_textarea" class="form-control" rows="5" placeholder="Start coding!" required></textarea> <div class="button-container"> <select required name="language-select" class="form-control" id="language_selector"> <option value="" selected disabled>Language</option> <option>20 options follow</option> <!-- THIS WILL KEEP THE VALUE IN THE DROPDOWN AFTER SUBMIT --> <script type="text/javascript"> document.getElementById('language_selector').value = ""; </script> </select> <br/> <br/> <div id="button-container" class="btn-toolbar"> <button id="drive_submit_btn" class="btn btn-md" type="submit">Preview</button> <button style="display:none" id="upload_btn" class="btn btn-md" type="submit">Upload</button> </div> </div> </form> <div class="show-code"> <script src="lib/prism.js"></script> <!-- THIS DISPLAYS THE CODE AFTER SUBMITTING USING THE PRISM.JS PLUGIN FOR SYNTAX HIGHLIGHTING --> <!-- Get language selection from dropdown and append it to language class. Echo the text as highlighted code --> <pre><code class="language-"></code></pre> </div> </div> <!-- THIS IS THE JAVASCRIPT TO HIDE THE BUTTON UNTIL TEXT IS ENTERED.--> <!-- HOWEVER IT ALWAYS HIDES IT!! -->,获取长度,发送长度,发送字节,接收长度,继续读取,累积数据,直到您拥有正确的数据长度,放入它变为ByteArrayOutputStream,并从中反序列化。不容易,尤其是手挥手,不停地阅读&#39;。它浪费时间和空间。