当前位置: 代码迷 >> Eclipse >> java.nio.channels.IllegalBlockingModeException
  详细解决方案

java.nio.channels.IllegalBlockingModeException

热度:443   发布时间:2016-04-23 14:13:06.0
非阻塞通信(ServerSocketChannels,SocketChannels)中无法用ObjectInputStream,ObjectOutputStream


》》》小弟我想写一个投票系统《《《
在server与client两端用非阻塞方式进行通信,服务器把投票任务的“对象”下发到 client端,client端把投票结果“对象”再回传给server端,但是出了问题,在client端与Server建立连接后,client端的语句:
 ObjectOutputStream oos = new ObjectOutputStream(socketChannel.socket().getOutputStream());
报错:
java.nio.channels.IllegalBlockingModeException
at java.nio.channels.Channels.write(Unknown Source)
at java.nio.channels.Channels.access$000(Unknown Source)
at java.nio.channels.Channels$1.write(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(Unknown Source)
at java.io.ObjectOutputStream.<init>(Unknown Source)
at cn.com.yd.vote.navigator.EchoClient3.talk(EchoClient3.java:50)
at cn.com.yd.vote.navigator.NavigatorView$Mythread.run(NavigatorView.java:61)
at java.lang.Thread.run(Unknown Source)
我在网上也查了一下原因,说是因为ObjectOutputStream是阻塞模式,而ServerSocketChannels,SocketChannels是非阻塞模式,但并没有说如何解决。
因为我想直接将对象序列化/反序列化,我想这样在数据传递读写过程中会很方便,但又不知道这样行不行的通,所以请各位高手给小弟指点一下

------解决方案--------------------
你既然用Channels,那当然要用Channels的读写方法了
Java code
ByteBuffer buf = ByteBuffer.wrap(message.getBytes());        int nbytes = channel.write(buf);//...
  相关解决方案