从一开始接触nio,了解其异步通信的优异性后,我就决定了要用这个知识来完成网络对战版俄罗斯方块的服务器和n个客户端的通信架构我的基本想法是:
发送端将相关信息封装到一个类里面,然后将该类的对象通过一定的转化,变为ByteBuffer来传递。接收端在反转回来。基于此原理来实现通信虽然一路上遇到很多问题,但都一个个的解决了,但最近我在该信息类里面封装了一个image对象后,我的转化算法罢工了!因为image对象不是序列化的!后面又干脆把image转化为byte[]数组来传递!但传递的过程又出现问题只要一加含有图片信息的byte[]数组就会抛出异常,各种异常头都大了现在异常纠结调试了半天,发现原来我的信息类一般都不大,我的byteBuffer开辟1024的空间已经够用了,但加了image的Byte[] 数组后信息类转ByteBuffer 的容量会飙升到30000多!我在想难道是因为这个原因???因为只是初学nio,所以特来请教nio的通道对于传送数据的大小有限制吗???要传比较大的数据要如何设计???在网上找的资料都是传的string。所以我觉得很奇怪!!!是不是我将nio用错方向了?nio有人用来传对象吗?为神马我用的会如此心酸= =。如果真是这样,nio无法达到我目前的要求,那是否有更好的选择最好不要了,nio已经搞的我头大了!!!求高人指点迷津
----一只迷途的羔羊
发送端将相关信息封装到一个类里面,然后将该类的对象通过一定的转化,变为ByteBuffer来传递。接收端在反转回来。基于此原理来实现通信虽然一路上遇到很多问题,但都一个个的解决了,但最近我在该信息类里面封装了一个image对象后,我的转化算法罢工了!因为image对象不是序列化的!后面又干脆把image转化为byte[]数组来传递!但传递的过程又出现问题只要一加含有图片信息的byte[]数组就会抛出异常,各种异常头都大了现在异常纠结调试了半天,发现原来我的信息类一般都不大,我的byteBuffer开辟1024的空间已经够用了,但加了image的Byte[] 数组后信息类转ByteBuffer 的容量会飙升到30000多!我在想难道是因为这个原因???因为只是初学nio,所以特来请教nio的通道对于传送数据的大小有限制吗???要传比较大的数据要如何设计???在网上找的资料都是传的string。所以我觉得很奇怪!!!是不是我将nio用错方向了?nio有人用来传对象吗?为神马我用的会如此心酸= =。如果真是这样,nio无法达到我目前的要求,那是否有更好的选择最好不要了,nio已经搞的我头大了!!!求高人指点迷津
----一只迷途的羔羊
解决方案 »
- 关于多word内容不同替换的问题
- 请教java绘制平行斜线的算法
- win7 java程序退出后,但在任务管理器里看到还有java.exe在运行
- 怎么把文件的空格删除啊?
- 一道面试题。急。。。。xdjm进来帮忙看看。。。。
- 新手正则表达式求教
- 【关键字overload跟override)何时用】我把重载, 覆盖的做了两个例子,发现根本没用这两个关键字
- 我不理解的是,既然是一个字符串,可为什么不直接返回return (String) ob,而是要返回一个String[]?
- 有没有人知道关于连接池详细介绍的网站,满意一定给分!
- 在哪能下到jbuilder5
- 实现Comparator 排序时异常
- 问一下,int类型不是能转换成char型吗,为什么这里会报错?而下一条代码不报错?
具体的步骤,就是向缓冲区里面不断的填充数据,当然,不是所有数据,
当填到一定数量的时候,flush数据(将缓冲区的数据推送的对端),
然后再接着填之后的数据,边填充,边flush,直到所有数据都传完了结束。
无数异常,说明楼主对异步IO的通信机制,框架的理解,还存在着诸多的问题。
不是框架不能应用的楼主的场景,只能说是使用不当。
别和我提TCP协议,TCP协议,只保证的数据传输的连续性与可靠性,但无法识别数据的类型、长度。
所以,在TCP协议的基础上,我们要实现C/S之间的通讯,都要自定义一个通讯协议,来区分每次传输的数据长度,数据类型等信息。
看楼主的公告,貌似使用了Java对象的序列化功能,作为自定义的通讯协议,也就是说,每次数据传输,只传递一个被序列化的对象,这个是可行的,但是,它有个弊端,就是,硬盘文件无法序列化。这个现象是必然的,因为Java对象,是在内存中的,我们不可能把一个大文件的所有数据全部加载到内存中,形成一个Java对象,有了Java对象,才能谈到对象的序列化,所以,硬盘文件是不可能进行序列化操作的。
我们通常的Java对象,也就十几个字节,多了也就一二百KB,所以,想要传输文件,还是另谋他路吧。
这个在C语言中,直接使用结构体Struct,放到IO里面一读一写直接就OK了,但是,在Java中,你要先将二进制的byte数组读取进来,分析这些数据,将里面的内容,分别set到对应的对象中去。发送的时候,也要讲对象的成员变量get处理,转换成二进制的byte数据,进行发送。小数据(一个缓冲区能放得下的数据)直接在内存中操作就可以了,
大数据或者说对于文件数据的操作,则需要多次的进行数据的操作,发送的时候,和文件拷贝的意思差不多,创建缓冲区,逐步发送数据,
flush方法就是将缓冲区的数据推送到对端的程序,
接收的时候,也是如此,创建临时文件,将缓冲区的数据写入到临时文件中去,
当传输完成后,交由使用者使用,或者,更名成相应的文件名。