从一开始接触nio,了解其异步通信的优异性后,我就决定了要用这个知识来完成网络对战版俄罗斯方块的服务器和n个客户端的通信架构我的基本想法是:
发送端将相关信息封装到一个类里面,然后将该类的对象通过一定的转化,变为ByteBuffer来传递。接收端在反转回来。基于此原理来实现通信虽然一路上遇到很多问题,但都一个个的解决了,但最近我在该信息类里面封装了一个image对象后,我的转化算法罢工了!因为image对象不是序列化的!后面又干脆把image转化为byte[]数组来传递!但传递的过程又出现问题只要一加含有图片信息的byte[]数组就会抛出异常,各种异常头都大了现在异常纠结调试了半天,发现原来我的信息类一般都不大,我的byteBuffer开辟1024的空间已经够用了,但加了image的Byte[] 数组后信息类转ByteBuffer 的容量会飙升到30000多!我在想难道是因为这个原因???因为只是初学nio,所以特来请教nio的通道对于传送数据的大小有限制吗???要传比较大的数据要如何设计???在网上找的资料都是传的string。所以我觉得很奇怪!!!是不是我将nio用错方向了?nio有人用来传对象吗?为神马我用的会如此心酸= =。如果真是这样,nio无法达到我目前的要求,那是否有更好的选择最好不要了,nio已经搞的我头大了!!!求高人指点迷津
                                                                            
                                                                                        ----一只迷途的羔羊

解决方案 »

  1.   

    ByteBuffer 不知道什么是Buffer吗 ?Buffer只是数据的缓冲区,不是全部的数据。楼主在传输大数据的时候,可以顺次的逐步将所有数据发送过去,
    具体的步骤,就是向缓冲区里面不断的填充数据,当然,不是所有数据,
    当填到一定数量的时候,flush数据(将缓冲区的数据推送的对端),
    然后再接着填之后的数据,边填充,边flush,直到所有数据都传完了结束。
    无数异常,说明楼主对异步IO的通信机制,框架的理解,还存在着诸多的问题。
    不是框架不能应用的楼主的场景,只能说是使用不当。
      

  2.   

    我再多说两句:  抛开NIO不谈,光说说通讯协议也是有些门道的,不知道楼主的程序,服务端和客户端采用的是什么样的通讯协议?
      别和我提TCP协议,TCP协议,只保证的数据传输的连续性与可靠性,但无法识别数据的类型、长度。
      所以,在TCP协议的基础上,我们要实现C/S之间的通讯,都要自定义一个通讯协议,来区分每次传输的数据长度,数据类型等信息。
        看楼主的公告,貌似使用了Java对象的序列化功能,作为自定义的通讯协议,也就是说,每次数据传输,只传递一个被序列化的对象,这个是可行的,但是,它有个弊端,就是,硬盘文件无法序列化。这个现象是必然的,因为Java对象,是在内存中的,我们不可能把一个大文件的所有数据全部加载到内存中,形成一个Java对象,有了Java对象,才能谈到对象的序列化,所以,硬盘文件是不可能进行序列化操作的。
    我们通常的Java对象,也就十几个字节,多了也就一二百KB,所以,想要传输文件,还是另谋他路吧。
      

  3.   

    Java面向对象的编程,在网络通信方面,有个比较麻烦的过程,就是要将通信的数据,转换成Java对象。
    这个在C语言中,直接使用结构体Struct,放到IO里面一读一写直接就OK了,但是,在Java中,你要先将二进制的byte数组读取进来,分析这些数据,将里面的内容,分别set到对应的对象中去。发送的时候,也要讲对象的成员变量get处理,转换成二进制的byte数据,进行发送。小数据(一个缓冲区能放得下的数据)直接在内存中操作就可以了,
    大数据或者说对于文件数据的操作,则需要多次的进行数据的操作,发送的时候,和文件拷贝的意思差不多,创建缓冲区,逐步发送数据,
    flush方法就是将缓冲区的数据推送到对端的程序,
    接收的时候,也是如此,创建临时文件,将缓冲区的数据写入到临时文件中去,
    当传输完成后,交由使用者使用,或者,更名成相应的文件名。
      

  4.   

    好强大的样子!!!通俗来说就是要分批传送数据吧!其实我有隐约感觉到这个问题,呵呵。因为是初学nio,确实对于缓冲区这一块的理解很薄弱,更认为这是一个难点再就是上面提到的通讯协议的问题!我其实对此更是知之甚少,望能不吝赐教呀~~~~因为我还在服务器中加入了组播的功能,是应用DatagramChannel来实现的,好像就有遇到这个通讯协议的问题希望得到更详细的介绍  = =。麻烦了