Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Flash网络通讯处理 陈苏俊

1,952 views

Published on

Published in: Education
  • Be the first to comment

  • Be the first to like this

Flash网络通讯处理 陈苏俊

  1. 1. FLASH SOCKET 通讯协议的处理 广州名游科技 弃天笑 ( 苏打 ) E-Mail:sujun10@21cn.com Blog:www.sujun.org
  2. 2. Flash Socket 的应用 <ul><li>目前大部分的 Flash Webgame ( MMORPG 类型)的都是采用 Socket 来做即时通讯 </li></ul><ul><li>例如第六大陆,摩尔庄园,奇想咕噜社区等 </li></ul>
  3. 3. Flash Soket 的两种 API <ul><li>1.XMLSocket </li></ul><ul><li>AS2.0 时采用的 socket 通讯类,在 AS3.0 时依然保留。该类只能通过发送字符串,一般发送 XML 格式的字符号串到服务端 </li></ul><ul><li>2.Socket </li></ul><ul><li>AS3.0 才拥有的对象,可以传输精确到字节 (Byte) ,可以充分发挥网络通讯的功能了。 </li></ul>
  4. 4. Flash Socket 好助手 ByteArray <ul><li>ByteArray 类提供用于优化读取、写入以及处理二进制数据的方法和属性 </li></ul><ul><li>在这里主要是利用 ByteArray 做数据缓存,把 socket 中的数据都取出来在 ByteArray 中存放,这样只操作 ByteArray ,安全。 </li></ul>
  5. 5. Flash 的安全策略机制 <ul><li>1. 当 Flash 连接服务器需要安全策略验证时,会向服务端发送特定的字符串信息: &quot;<policy-file-request/>&quot; </li></ul><ul><li>2. 服务端在验证到这个字符串之后,马上给 Flash 返回策略文件。客户端收到策略文件之后会断开重新连接该服务器(假设正确的策略文件) </li></ul><ul><li><cross-domain-policy> </li></ul><ul><li><allow-access-from domain=&quot;*&quot; to-ports=&quot;* &quot;/> </li></ul><ul><li></cross-domain-policy> </li></ul>
  6. 6. 服务端读 Flash 安全策略请求信息 <ul><li>// 新建一个连接 </li></ul><ul><li>Socket socket = serverSocket.accept(); </li></ul><ul><li>System.out.println(&quot; 连接成功 ......&quot;); </li></ul><ul><li>BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); </li></ul><ul><li>PrintWriter pw = new PrintWriter(socket.getOutputStream()); </li></ul><ul><li>// 声明字节空间 </li></ul><ul><li>char[] by = new char[22] </li></ul><ul><li>br.read(by,0,22); </li></ul><ul><li>String head = new String(by); </li></ul><ul><li>if(head.equals(&quot;<policy-file-request/>&quot;)) </li></ul><ul><li>{// 满足安全策略请求信息,发送回 XML 文件 </li></ul><ul><li>pw.print(xml + &quot;&quot;); </li></ul><ul><li>pw.flush(); </li></ul><ul><li>} </li></ul>
  7. 7. Socket 字节传输的协议结构 <ul><li>1. 根据 socket 发送字节特性,可以自定义通讯协议,从而提高了协议的灵活性。 </li></ul><ul><li>2. 最基础的协议结构: </li></ul><ul><li>传输内容长度 + 传输具体内容( len + body ) </li></ul><ul><li>3. 说明:这是最基本的传输格式,每次发一段数据给服务器的时候,都先声明一个长度 (int,4byte) ,表示后面多少字节的内容是这次消息的具体内容 ( 多少 byte) </li></ul>
  8. 8. 协议通讯示例图 <ul><li>Flash 客户端和服务端的通讯协议意图 </li></ul>客户端 消息长度 + 消息体 服务端 解码 编码 解码 编码
  9. 9. Flash Socket 处理网络流数据例子 <ul><li>// 如果需要读信息头 </li></ul><ul><li>if(isReadHead) </li></ul><ul><li>{ </li></ul><ul><li>if(socket.bytesAvailable >= headLen) </li></ul><ul><li>{ </li></ul><ul><li>// 读出指示后面的数据有多大 </li></ul><ul><li>msgLen = socket.readUnsignedInt(); </li></ul><ul><li>isReadHead = false; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>// 如果已经读了信息头 , 则看能不能收到满足条件的字节数 </li></ul><ul><li>if(!isReadHead && msgLen <= msgLenMax) </li></ul><ul><li>{ </li></ul><ul><li>// 如果为 0, 表示收到异常消息 </li></ul><ul><li>if(msgLen == 0) </li></ul><ul><li>{ </li></ul><ul><li>// 一般消息长度为 0 的话,表示与服务器出了错,或者即将被断开等,通知客户端,进行特别处理 </li></ul><ul><li>listener(msgLen,null); </li></ul><ul><li>return ; </li></ul><ul><li>} </li></ul><ul><li>// 数据流里的数据满足条件,开始读数据 </li></ul><ul><li>if(socket.bytesAvailable >= msgLen) </li></ul><ul><li>{ </li></ul><ul><li>// 指针回归 </li></ul><ul><li>bytes.position = 0; </li></ul><ul><li>// 取出指定长度的网络字节 </li></ul><ul><li>socket.readBytes(bytes, 0, msgLen); </li></ul><ul><li>listener(msgLen,bytes); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  10. 10. 服务端的处理 <ul><li>服务端在处理客户端的数据的流程跟客户端几乎是一样的。客户端以什么样的格式发送数据,那么服务端就怎么样去解析。 </li></ul><ul><li>当然,服务端多了一条处理安全策略验证请求的数据处理机制。 </li></ul>
  11. 11. Socket 通讯之旅 <ul><li>1. 接下来通过一个角色同步移动的例子来说明 flash 与 socket 通讯之间关于协议的封装和解析。 </li></ul><ul><li>2. 该例子的主角是一个圆圈(用户),通过登录服务器,进入一个多人房间。同时他会看到房间其他人的动作,自己的动作也会被其他人看到。 </li></ul>
  12. 12. 用户进入房间流程 <ul><li>登录:进入房间 – 广播登录用户 – 获取当前已经存在的用户 </li></ul><ul><li>移动: 玩家移动坐标 – 服务器记录当前用户的移动坐标 - 广播给当前房间所有的用户 </li></ul>
  13. 13. 关于例子的扩展 <ul><li>1. 例子里所展示的通讯协议的发送和接受,直接编写在程序中的。这只是为了方便演示和观看学习。 </li></ul><ul><li>2. 真正开发应用的时候应该对解码和编码这个过程进行封装,外部通过调用接口等进行调用。 </li></ul><ul><li>3. 同时 Body 内容可以进行多种扩展,例如采用 AMF3 封装,或者自定义结构封装。 </li></ul>
  14. 14. Socket 通讯的思考 <ul><li>1. 编码解码的封装 </li></ul><ul><li>2. 协议的统一实现(例如 AMF3 ) </li></ul><ul><li>3. 关于 socket 的具体优化 </li></ul><ul><li>4. 更多应用 </li></ul>
  15. 15. 完毕,谢谢 <ul><li>注:我个人 Blog 也提供了类似的例子,包括 XMLSocket 的通讯,安全策略的服务器, 以及 Flash 端解析 socket 数据流的文章 </li></ul>

×