Amf3+socket开发网络游戏或应用的一点研究心得

来源:互联网 发布:曹雪芹原型贾宝玉知乎 编辑:程序博客网 时间:2024/04/28 02:07
Amf3+socket开发网络游戏开发时的要点和心得。 

数据类型: 
as3+socket,一搜网上一大堆,但是大多是基于字符串的传递,就是发送和接收都是字符串,每个消息用换行来区分,这不是坑爹么!如果我要发送布尔,数组,带换行的字符串咋办?如果用其他的字符来代替换行符然后再转换处理也太傻了点吧。所以就好的办法就是使用二进制数据来处理,as3发送二进制数据应该没有什么太大的问题,socket的方法里的writeXXX全是写成二进制的数据,主要是服务端的处理也要用二进制才行。 
然后是使用AMF3的格式来发送,socket的writeObject就是把一个对象序列化为一个AMF3或者AMF0格式的二进制数据的,服务端需要搭配第三方类库来解码为可用的数据。AMF3的使用可以看这里,JAVA为后台的:http://blog.sina.com.cn/s/blog_6bc2090c0100ru9w.html 

粘包和断包: 
TCP中没有包的概念,只有流的概念。所有的数据都是接收到缓冲区一满就发送,比如我们发送了多个数据,最后可能会一次性都发送出去,这时候再处理就没办法区分,这样叫做粘包。还有断包,由于数据太大或者网络太慢,一条数据被发送了多次,这样叫做断包,处理方法,手动加入一个包头来区分每个包,可以参考下面的文章:http://cjmxp007.blog.163.com/blog/static/35473837201061054116916/ 

服务端的阻塞和非阻塞: 
阻塞就是使用多线程,一个客户端对应一个线程,这样容易引起一些问题,主要是资源浪费和一些并发问题。而非阻塞则是用一个线程来处理所有的问题,可以节省资源和避免并发问题。不同的后台语言的实现方法就自己去找了,我这里搜到非阻塞的一些介绍,JAVA的:http://www.doc88.com/p-67443613181.html 

as3的socket安全策略问题: 
每次用我们的自定义的socket连接之前swf都会先用一个特殊的socket先进行连接,该socket用来申请安全策略,会发送字符串"<policy-file-request/>\0"然后等待我们返回安全策略的字符串回去,如果安全策略允许连接则断开这个特殊的socket连接再用我们的socket去连接,否则就不会连接,这里有很多的说明:http://hi.baidu.com/mr_ziqiang/blog/item/7a2c4baf2c4a21fdfbed501e.html 

断网问题: 
这个是我最怕的,弄到现在都没弄好,就一个解决问题的思想,以后有时间再弄了,这里就说说我的解决方法吧。
首先说说关闭和断网不一样,关闭是客户端调用close方法,服务端会接收到一个空消息;或者服务端关闭一个客户端,客户端会触发Event.CLOSE事件。好了,如果断网的话,客户端不会有任何的事件和异常,服务端就更傻了,还可以给这个客户端发送消息,没有任何异常,当然了,两个都是发得出去但是啥也收不到,咋办呢,这里发现一篇文章:http://liu-ms.iteye.com/blog/935051 
就用这个方法来处理,客户端和服务端都弄一个超时的计时器,每次发送消息都要对方在接收到消息后返回一个特殊消息,如果超过一定时限还没有接收到对应的消息则视为断网这种情况,然后就用方法close关闭掉,再在一定时间后重新连接既可。 

数据压缩(优化传输速度): 
呵呵,这个是最轻松的一个了,flash用的是ZLib压缩算法,一个压了再发送给另一个,接收到再解压既可,注意两点:1.我发现如果数据在150个字节以下时压缩后会变大,数据越大压缩效果越明显。2.包头信息不要压缩,那个包头是用来解决粘包和断包问题的,压了可不得了。 

基本上就是这些问题了,呵呵,在编程的学习道路上,一直没人手把手指点,只能靠网上大家的一点点奉献来学习,往往很简单的问题得弄很久,所以把这几天的研究心得也贡献出来了,希望大家少走弯路,如果文中有不对的地方还请各位大神不吝赐教
原创粉丝点击