Flash网络通讯处理 陈苏俊

1,812
-1

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,812
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
33
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×