小弟写了一个非阻塞的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); 

解决方案 »

  1.   

    一直没编写socket程序。
    不过解决大对象传输基本是,缓存,分发,窗口协议。
    --------------------------------------------------
    对象序列化后:
    一个对象 89字节
    分发为50-- 39
    在读取50的时候不能形成一个完整的对象。
    这你就要思考一下了,是否在接受的时候全部接受完毕后在还原对象呢!一个想法而已。