小弟写了一个非阻塞的client 与 server
不过有不少问题,还请各位高手指点一下
我把一个自定义的类的对象序列化后由 client发给server 端
如果对象序列化后的字节比较小,如2000 byte , server端可以全部接收并进行反序列化
如果对象序列化后的字节比校大,如8000 byte , server端就不能全部接收并进行反序列化 出现不能全部接收的现象出现的条件是:server在一台XP机器上运行,由client在另一台XP机器上进行发送
如果client与server在同一台机器上就不会有上面的问题了,这个一直困扰着我,而且问题很着急!client与server端发送数据的方法一样:
SocketChannel socketChannel=(SocketChannel)key.channel();
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bOut);
out.writeObject(object);
out.flush();
byte[] arr = bOut.toByteArray();
ByteBuffer bb = ByteBuffer.wrap(arr);
out.close();
socketChannel.write(bb); 而且我也在client有如下设置:
socketChannel.socket().setReceiveBufferSize(32768);
socketChannel.socket().setSendBufferSize(32768);
在SERVER端有如下设置:
serverSocketChannel.socket().setReceiveBufferSize(32768);
我写的是一个投票系统,所以如果被投票人少的话就意味着对外序列化后的字节数较小,反之会较大,就会出上面的问题 我是通过Eclipse的调试,client在不与server同一台机器上进行发送时,看出来当执行socketChannel.read(bbIn);后,在对应的字节数组中接收到的字节数没有client在与server同一台机器上进行发送时接收到的字节数多,而且差很多,因而会引起异常 SERVER端接收的方法:
ObjectInputStream in = null;
SocketChannel socketChannel=(SocketChannel)key.channel();
ByteBuffer bbIn = ByteBuffer.allocate(32768);
socketChannel.read(bbIn);
ByteArrayInputStream bIn = new ByteArrayInputStream(bbIn.array());
in = new ObjectInputStream(bIn);
不过有不少问题,还请各位高手指点一下
我把一个自定义的类的对象序列化后由 client发给server 端
如果对象序列化后的字节比较小,如2000 byte , server端可以全部接收并进行反序列化
如果对象序列化后的字节比校大,如8000 byte , server端就不能全部接收并进行反序列化 出现不能全部接收的现象出现的条件是:server在一台XP机器上运行,由client在另一台XP机器上进行发送
如果client与server在同一台机器上就不会有上面的问题了,这个一直困扰着我,而且问题很着急!client与server端发送数据的方法一样:
SocketChannel socketChannel=(SocketChannel)key.channel();
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bOut);
out.writeObject(object);
out.flush();
byte[] arr = bOut.toByteArray();
ByteBuffer bb = ByteBuffer.wrap(arr);
out.close();
socketChannel.write(bb); 而且我也在client有如下设置:
socketChannel.socket().setReceiveBufferSize(32768);
socketChannel.socket().setSendBufferSize(32768);
在SERVER端有如下设置:
serverSocketChannel.socket().setReceiveBufferSize(32768);
我写的是一个投票系统,所以如果被投票人少的话就意味着对外序列化后的字节数较小,反之会较大,就会出上面的问题 我是通过Eclipse的调试,client在不与server同一台机器上进行发送时,看出来当执行socketChannel.read(bbIn);后,在对应的字节数组中接收到的字节数没有client在与server同一台机器上进行发送时接收到的字节数多,而且差很多,因而会引起异常 SERVER端接收的方法:
ObjectInputStream in = null;
SocketChannel socketChannel=(SocketChannel)key.channel();
ByteBuffer bbIn = ByteBuffer.allocate(32768);
socketChannel.read(bbIn);
ByteArrayInputStream bIn = new ByteArrayInputStream(bbIn.array());
in = new ObjectInputStream(bIn);
不过解决大对象传输基本是,缓存,分发,窗口协议。
--------------------------------------------------
对象序列化后:
一个对象 89字节
分发为50-- 39
在读取50的时候不能形成一个完整的对象。
这你就要思考一下了,是否在接受的时候全部接受完毕后在还原对象呢!一个想法而已。