指点迷津----nio服务器架构问题

蜗蜗牛快跑 2012-07-09 09:07:56
从一开始接触nio,了解其异步通信的优异性后,我就决定了要用这个知识来完成网络对战版俄罗斯方块的服务器和n个客户端的通信架构

我的基本想法是:
发送端将相关信息封装到一个类里面,然后将该类的对象通过一定的转化,变为ByteBuffer来传递。接收端在反转回来。基于此原理来实现通信

虽然一路上遇到很多问题,但都一个个的解决了,但最近我在该信息类里面封装了一个image对象后,我的转化算法罢工了!因为image对象不是序列化的!后面又干脆把image转化为byte[]数组来传递!但传递的过程又出现问题。。。只要一加含有图片信息的byte[]数组就会抛出异常,各种异常。。。头都大了

现在异常纠结。。。调试了半天,发现原来我的信息类一般都不大,我的byteBuffer开辟1024的空间已经够用了,但加了image的Byte[] 数组后信息类转ByteBuffer 的容量会飙升到30000多!我在想难道是因为这个原因???

因为只是初学nio,所以特来请教nio的通道对于传送数据的大小有限制吗???要传比较大的数据要如何设计???在网上找的资料都是传的string。。。。所以我觉得很奇怪!!!是不是我将nio用错方向了?nio有人用来传对象吗?为神马我用的会如此心酸= =。

如果真是这样,nio无法达到我目前的要求,那是否有更好的选择。。。最好不要了,nio已经搞的我头大了!!!求高人指点迷津

----一只迷途的羔羊
...全文
178 5 打赏 收藏 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
蜗蜗牛快跑 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

我再多说两句:

抛开NIO不谈,光说说通讯协议也是有些门道的,不知道楼主的程序,服务端和客户端采用的是什么样的通讯协议?
别和我提TCP协议,TCP协议,只保证的数据传输的连续性与可靠性,但无法识别数据的类型、长度。
所以,在TCP协议的基础上,我们要实现C/S之间的通讯,都要自定义一个通讯协议,来区分每次传输的数据长度,数据类型等信息。


看楼主的公告,貌……
[/Quote]


好强大的样子!!!通俗来说就是要分批传送数据吧!其实我有隐约感觉到这个问题,呵呵。

因为是初学nio,确实对于缓冲区这一块的理解很薄弱,更认为这是一个难点。。。

再就是上面提到的通讯协议的问题!我其实对此更是知之甚少,望能不吝赐教呀~~~~因为我还在服务器中加入了组播的功能,是应用DatagramChannel来实现的,好像就有遇到这个通讯协议的问题。。。希望得到更详细的介绍 = =。麻烦了。。。
冰思雨 2012-07-09
  • 打赏
  • 举报
回复
Java面向对象的编程,在网络通信方面,有个比较麻烦的过程,就是要将通信的数据,转换成Java对象。
这个在C语言中,直接使用结构体Struct,放到IO里面一读一写直接就OK了,但是,在Java中,你要先将二进制的byte数组读取进来,分析这些数据,将里面的内容,分别set到对应的对象中去。发送的时候,也要讲对象的成员变量get处理,转换成二进制的byte数据,进行发送。

小数据(一个缓冲区能放得下的数据)直接在内存中操作就可以了,
大数据或者说对于文件数据的操作,则需要多次的进行数据的操作,

发送的时候,和文件拷贝的意思差不多,创建缓冲区,逐步发送数据,
flush方法就是将缓冲区的数据推送到对端的程序,
接收的时候,也是如此,创建临时文件,将缓冲区的数据写入到临时文件中去,
当传输完成后,交由使用者使用,或者,更名成相应的文件名。
冰思雨 2012-07-09
  • 打赏
  • 举报
回复
我再多说两句:

抛开NIO不谈,光说说通讯协议也是有些门道的,不知道楼主的程序,服务端和客户端采用的是什么样的通讯协议?
别和我提TCP协议,TCP协议,只保证的数据传输的连续性与可靠性,但无法识别数据的类型、长度。
所以,在TCP协议的基础上,我们要实现C/S之间的通讯,都要自定义一个通讯协议,来区分每次传输的数据长度,数据类型等信息。


看楼主的公告,貌似使用了Java对象的序列化功能,作为自定义的通讯协议,也就是说,每次数据传输,只传递一个被序列化的对象,这个是可行的,但是,它有个弊端,就是,硬盘文件无法序列化。这个现象是必然的,因为Java对象,是在内存中的,我们不可能把一个大文件的所有数据全部加载到内存中,形成一个Java对象,有了Java对象,才能谈到对象的序列化,所以,硬盘文件是不可能进行序列化操作的。
我们通常的Java对象,也就十几个字节,多了也就一二百KB,所以,想要传输文件,还是另谋他路吧。
冰思雨 2012-07-09
  • 打赏
  • 举报
回复
ByteBuffer 不知道什么是Buffer吗 ?

Buffer只是数据的缓冲区,不是全部的数据。

楼主在传输大数据的时候,可以顺次的逐步将所有数据发送过去,
具体的步骤,就是向缓冲区里面不断的填充数据,当然,不是所有数据,
当填到一定数量的时候,flush数据(将缓冲区的数据推送的对端),
然后再接着填之后的数据,边填充,边flush,直到所有数据都传完了结束。


无数异常,说明楼主对异步IO的通信机制,框架的理解,还存在着诸多的问题。
不是框架不能应用的楼主的场景,只能说是使用不当。
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 用户账户控制(UAC)白名单的配置 Windows7环境中 UAC(User Account Control,用户帐户控制)是由微软在Windows Vista版本中推出的一项旨在增强系统安全性的创新技术,该技术强制要求用户在执行可能干扰计算机正常运作的操作或进行更改会波及其他用户设置的变动前,必须提供相应的权限或管理员密码进行验证。通过对这些操作启动前进行授权确认,UAC能够有效阻止恶意软件及间谍软件在未获授权的状态下于计算机内进行安装或实施修改。 自从Vista版本问世以来,微软便开始推行这一全新的安全机制,可视为对系统安全防护的显著提升。尽管UAC确实能够在一定程度上对某些非法程序起到防御作用,但与此同时,这一功能也给众多用户带来了诸多不便。 因此,许多用户开始探寻是否存在类似于白名单的功能,以便将那些值得信赖的程序直接赋予运行权限。事实上,这类功能确实存在,不过微软并未将其作为标准配置提供。 网络上关于此问题的绝大多数建议都是建议禁用UAC,这种说法显然缺乏针对性,因为若用户希望禁用此功能,本就不会提出相关疑问。 通过运用微软官方发布的Microsoft Application Compatibility Toolkit 5.6版本,可以将信任的程序纳入系统白名单范畴。 获取Application Compatibility Toolkit 安装程序成功后会出现三个可执行文件 以管理员身份启动Compatibility Administrator 在Custom DataBases部分创建新的数据库,并添加一个Application Fix(在下方空白处点击右键,选择...
下载代码方式:https://pan.quark.cn/s/a4b39357ea24 DELL服务器的操作系统部署流程包含一系列细致的环节,其适用范围涵盖多种操作系统类型,例如Windows Server与Red Hat Linux等。在启动部署之前,必须确认服务器的光驱设备为DVD驱动器,并且需准备对应的系统安装媒介。下面将详细列出完整的部署步骤: 1. **启动准备**:将随服务器提供的Systems Management Tools and Documentation version 6.0光盘置入服务器光驱,随后设定服务器以光驱作为启动设备。此环节旨在确保服务器在启动阶段能够读取安装光盘内容。 2. **语言设定**:服务器启动后,选定简体中文作为部署语言,并确认接受许可协议条款。 3. **时区选择**:在部署期间,需设定时区为北京、香港、重庆或乌鲁木齐,依据实际地理位置进行适配选择。 4. **系统类型选择**:随后,需选定计划部署的操作系统,支持的版本包括Server 2003 SP2、Server 2003 SP2 64位版本、Windows 2003 SBS SP2、Server 2008、Windows 2008 SBS/EBS x64版本等,以及多种Red Hat和SUSE Linux版本。 5. **RAID设定**:若服务器出厂时已预设RAID配置,则可选择跳过此步骤。若需重新设定RAID,操作时需格外小心,因为这一过程可能引发硬盘数据遗失。 6. **引导分区规划**:设定引导分区的大小,通常C盘建议预留至少20GB的空间,具体容量需根据系统需求进行调整。 7. **网络设定**:网络设定可在系统部署完成后执行,部署期间建议暂时拔除...

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧