[flash开发者交流][2010.07.24]flash socket通讯协议的处理(陈苏俊)

15
FLASH SOCKET 通通通通通通通 通通通通通通 通通通 ( 通通 ) E- Mail:[email protected] Blog:www.sujun.org

Upload: shanda-innovation-institute

Post on 18-Nov-2014

2.548 views

Category:

Technology


3 download

DESCRIPTION

 

TRANSCRIPT

Page 1: [Flash开发者交流][2010.07.24]flash socket通讯协议的处理(陈苏俊)

FLASH SOCKET 通讯协议的处理

广州名游科技 弃天笑 ( 苏打 )

E-Mail:[email protected]:www.sujun.org

Page 2: [Flash开发者交流][2010.07.24]flash socket通讯协议的处理(陈苏俊)

Flash Socket 的应用• 目前大部分的 Flash Webgame ( MMORPG

类型)的都是采用 Socket 来做即时通讯• 例如第六大陆,摩尔庄园,奇想咕噜社区

Page 3: [Flash开发者交流][2010.07.24]flash socket通讯协议的处理(陈苏俊)

Flash Soket 的两种 API

• 1.XMLSocket• AS2.0 时采用的 socket 通讯类,在 AS3.0 时

依然保留。该类只能通过发送字符串,一般发送 XML 格式的字符号串到服务端

• 2.Socket• AS3.0 才拥有的对象,可以传输精确到字节

(Byte) ,可以充分发挥网络通讯的功能了。

Page 4: [Flash开发者交流][2010.07.24]flash socket通讯协议的处理(陈苏俊)

Flash Socket 好助手 ByteArray

• ByteArray 类提供用于优化读取、写入以及处理二进制数据的方法和属性

• 在这里主要是利用 ByteArray 做数据缓存,把 socket 中的数据都取出来在 ByteArray 中存放,这样只操作 ByteArray ,安全。

Page 5: [Flash开发者交流][2010.07.24]flash socket通讯协议的处理(陈苏俊)

Flash 的安全策略机制• 1. 当 Flash 连接服务器需要安全策略验证时,

会向服务端发送特定的字符串信息: "<policy-file-request/>"

• 2. 服务端在验证到这个字符串之后,马上给 Flash 返回策略文件。客户端收到策略文件之后会断开重新连接该服务器(假设正确的策略文件)

• <cross-domain-policy>• <allow-access-from domain="*" to-ports="* "/>• </cross-domain-policy>

Page 6: [Flash开发者交流][2010.07.24]flash socket通讯协议的处理(陈苏俊)

服务端读 Flash 安全策略请求信息

• // 新建一个连接• Socket socket = serverSocket.accept();• System.out.println(" 连接成功 ......");• BufferedReader br = new BufferedReader(new InputStrea

mReader(socket.getInputStream()));• PrintWriter pw = new PrintWriter(socket.getOutputStream());• // 声明字节空间• char[] by = new char[22]• br.read(by,0,22);• String head = new String(by);• if(head.equals("<policy-file-request/>"))• {// 满足安全策略请求信息,发送回 XML 文件• pw.print(xml + "\0");• pw.flush();• }

Page 7: [Flash开发者交流][2010.07.24]flash socket通讯协议的处理(陈苏俊)

Socket 字节传输的协议结构• 1. 根据 socket 发送字节特性,可以自定义通

讯协议,从而提高了协议的灵活性。• 2. 最基础的协议结构:• 传输内容长度 + 传输具体内容( len + bod

y )• 3. 说明:这是最基本的传输格式,每次发一

段数据给服务器的时候,都先声明一个长度(int,4byte) ,表示后面多少字节的内容是这次消息的具体内容 ( 多少 byte)

Page 8: [Flash开发者交流][2010.07.24]flash socket通讯协议的处理(陈苏俊)

协议通讯示例图• Flash 客户端和服务端的通讯协议意图

客户端 消息长度 + 消息体 服务端解码编码

解码编码

Page 9: [Flash开发者交流][2010.07.24]flash socket通讯协议的处理(陈苏俊)

Flash Socket 处理网络流数据例子• // 如果需要读信息头• if(isReadHead)• {• if(socket.bytesAvailable >= headLen)• {• // 读出指示后面的数据有多大• msgLen = socket.readUnsignedInt();• isReadHead = false;• }• }• // 如果已经读了信息头 , 则看能不能收到满足条件的字节数• if(!isReadHead && msgLen <= msgLenMax)• {• // 如果为 0, 表示收到异常消息• if(msgLen == 0)• {• // 一般消息长度为 0 的话,表示与服务器出了错,或者即将被断开等,通知客户端,进行特别处理• listener(msgLen,null);• return ;• }• // 数据流里的数据满足条件,开始读数据• if(socket.bytesAvailable >= msgLen)• {• // 指针回归• bytes.position = 0;• // 取出指定长度的网络字节• socket.readBytes(bytes, 0, msgLen);• listener(msgLen,bytes);• }• }

Page 10: [Flash开发者交流][2010.07.24]flash socket通讯协议的处理(陈苏俊)

服务端的处理• 服务端在处理客户端的数据的流程跟客户

端几乎是一样的。客户端以什么样的格式发送数据,那么服务端就怎么样去解析。

• 当然,服务端多了一条处理安全策略验证请求的数据处理机制。

Page 11: [Flash开发者交流][2010.07.24]flash socket通讯协议的处理(陈苏俊)

Socket 通讯之旅• 1. 接下来通过一个角色同步移动的例子来

说明 flash 与 socket 通讯之间关于协议的封装和解析。

• 2. 该例子的主角是一个圆圈(用户),通过登录服务器,进入一个多人房间。同时他会看到房间其他人的动作,自己的动作也会被其他人看到。

Page 12: [Flash开发者交流][2010.07.24]flash socket通讯协议的处理(陈苏俊)

用户进入房间流程• 登录:进入房间 – 广播登录用户 – 获取当

前已经存在的用户

• 移动: 玩家移动坐标 – 服务器记录当前用户的移动坐标 - 广播给当前房间所有的用户

Page 13: [Flash开发者交流][2010.07.24]flash socket通讯协议的处理(陈苏俊)

关于例子的扩展• 1. 例子里所展示的通讯协议的发送和接受,直接编写在程序中的。这只是为了方便演示和观看学习。

• 2.真正开发应用的时候应该对解码和编码这个过程进行封装,外部通过调用接口等进行调用。

• 3.同时 Body 内容可以进行多种扩展,例如采用 AMF3封装,或者自定义结构封装。

Page 14: [Flash开发者交流][2010.07.24]flash socket通讯协议的处理(陈苏俊)

Socket 通讯的思考• 1. 编码解码的封装• 2. 协议的统一实现(例如 AMF3 )• 3.关于 socket 的具体优化• 4.更多应用

Page 15: [Flash开发者交流][2010.07.24]flash socket通讯协议的处理(陈苏俊)

完毕,谢谢• 注:我个人 Blog也提供了类似的例子,包

括 XMLSocket 的通讯,安全策略的服务器, 以及 Flash 端解析 socket 数据流的文章