`
ch_kexin
  • 浏览: 898993 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
社区版块
存档分类
最新评论

关于 AS3 Socket 通信基础(四)

 
阅读更多
4.同Socket服务器进行握手,并确定收到了什么样的数据和如何处理这些数据. 
     创建不同的常量来声明协议的状态.使用这些常量将指定的处理函数映射到相应的状态.在一个socketData事件控制器中,通过状态映射调用这些函数的. 

     建立Socket连接通常要处理握手这个环节.尤其是在服务器初始化需要向客户端发送数据.然后客户端通过一种特殊的方式相应这些数据,接着服务器因此再次响应.整个处理过程直到握手完成并且建立起一个"正常的"连接为止.

    处理服务器的不同响应是非难的,主要的原因是socketData事件控制器不能保存上下文的顺序.也就是说,服务器的响应不会告诉你"为什么"响应, 也不告诉你这些响应数据被那个处理程序来处理.要想知道如何处理这些从服务器返回的响应不能从响应的本身来获得,尤其在响应变化的时候.或许一个响应返回 了两个字节码,另一个返回了一个整数值还跟了一个双精度浮点数.这样看来让响应本身处理自己是一大难题.

    我们通过创建一个状态量来标注不同的上下文,服务器通过这些上下文将数据发送到客户端.与这些状态量都有一个相关联的函数来处理该数据,这样你就可以很轻松的按照当前的协议状态去调用正确的处理函数.

    当你要与一个Socket服务器建立连接需要考虑如下几个步骤: 
1.当与服务器连接的时候,服务器立刻返回一个标志服务器可以支持的最高协议版本号的整数值. 
2.客户端在响应的时候会返回一个实际使用协议的版本号. 
3.服务器返回一个8byte的鉴定码. 
4.然后客户端将这鉴定码返回到服务器. 
5.如果客户端的响应不是服务器端所期望的,或者,就在这个时候该协议变成了一个常规操作模式,于是握手结束. 

    实际上在第四步可以在鉴定码中包含更多的安全响应.你可以通过发送各种加密方法的密匙来代替逐个发送的鉴定码.这通常使用在客户端向用户索要密码的时候, 然后密码成为了加密过的8byte鉴定码.该加密过的鉴定码接着返回到服务器.如果响应的鉴定码匙服务器所期望的,客户端就知道该密码是正确的,然后同意 建立连接.

    实现握手框架,你首先要为处理从服务器返回的不同类型的数据分别创建常量.首先,你要从步骤1确定版本号.然后从步骤3收取鉴定码.最后就是步骤5的常规操作模式.我们可以声明

如下常量: 

public const DETERMINE_VERSION:int = 0; 
public const RECEIVE_CHALLENGE:int = 1; 
public const NORMAL:int = 2; 

   常量的值并不重要,重要的是这些值要是不同的值,两两之间不能有相同的整数值. 

   下一个步骤我们就要为不同的数据创建不同处理函数了.创建的这三个函数分别被命名为readVersion( ), readChallenge( ) 和 readNormalProtocol( ). 创建完这三个函数后,我们就必须将这三个函数分别映射到前面不同状态常量,从而分别处理在该状态中收到的数据.代码如下:

stateMap = new Object(   ); 
stateMap[ DETERMINE_VERSION ] = readVersion; 
stateMap[ RECEIVE_CHALLENGE ] = readChallenge; 
stateMap[ NORMAL             ] = readNormalProtocol; 

   最后一步是编写socketData事件处理控制器,只有通过这样的方式,建立在当前协议状态之上的正确的处理函数才可以被调用.首先需要创建一个 currentState的int变量.然后使用stateMap去查询与currentState相关联的函数,这样处理函数就可以被正确调用了.

    var processFunc:Function = stateMap[ currentState ];
  1. package {
  2. import flash.display.Sprite;
  3. import flash.events.ProgressEvent;
  4. import flash.net.Socket;
  5. import flash.utils.ByteArray;
  6. public class SocketExample extends Sprite {
  7.     // The state constants to describe the protocol
  8.     public const DETERMINE_VERSION:int = 0;
  9.     public const RECEIVE_CHALLENGE:int = 1;
  10.     public const NORMAL:int = 2;
  11.    
  12.     // Maps a state to a processing function
  13.     private var stateMap:Object;
  14.    
  15.     // Keeps track of the current protocol state
  16.     private var currentState:int;
  17.    
  18.     private var socket:Socket;
  19.     public function SocketExample( ) {
  20.       // Initialzes the states map
  21.       stateMap = new Object( );
  22.       stateMap[ DETERMINE_VERSION ] = readVersion;
  23.       stateMap[ RECEIVE_CHALLENGE ] = readChallenge;
  24.       stateMap[ NORMAL            ] = readNormalProtocol;
  25.      
  26.       // Initialze the current state
  27.       currentState = DETERMINE_VERSION;
  28.       // Create and connect the socket
  29.       socket = new Socket( );
  30.       socket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData );
  31.       socket.connect( "localhost", 2900 );
  32.     }
  33.    
  34.     private function onSocketData( eventrogressEvent ):void {
  35.       // Look up the processing function based on the current state
  36.       var processFunc:Function = stateMap[ currentState ];
  37.       processFunc( );
  38.     }
  39.    
  40.     private function readVersion( ):void {
  41.       // Step 1 - read the version from the server
  42.       var version:int = socket.readInt( );
  43.      
  44.       // Once the version is read, the next state is receiving
  45.       // the challenge from the server
  46.       currentState = RECEIVE_CHALLENGE;
  47.      
  48.       // Step 2 - write the version back to the server
  49.       socket.writeInt( version );
  50.       socket.flush( );
  51.     }
  52.    
  53.     private function readChallenge( ):void {
  54.       // Step 3 - read the 8 byte challenge into a byte array
  55.       var bytes:ByteArray = new ByteArray( );
  56.       socket.readBytes( bytes, 0, 8 );
  57.      
  58.       // After the challenge is received, the next state is
  59.       // the normal protocol operation
  60.       currentState = NORMAL;
  61.      
  62.       // Step 4 - write the bytes back to the server
  63.       socket.writeBytes( bytes );
  64.       socket.flush( );
  65.     }
  66.    
  67.     private function readNormalProtocol( ):void {
  68.       // Step 5 - process the normal socket messages here now that
  69.       // that handshaking process is complete
  70.     }
  71. }
  72. }
复制代码
processFunc(   ); // Invoke the appropriate processing function 

   下面是一点与薄记相关的处理程序.在你的代码中更新currentState从而确保当前协议的状态. 
   前面我们所探讨的握手步骤的完整的代码如下:
 
 
分享到:
评论

相关推荐

    一段as3.0与c++socket通信的例子(as端代码)

    以下是一些关于AS3.0 Socket通信的关键知识点: 1. **创建Socket对象**: 首先,我们需要创建一个`Socket`对象实例,通过调用其构造函数指定服务器的IP地址和端口号。例如: ```as3 var socket:Socket = new ...

    FLASH AS3 SOCKET收发16进制示例

    `HEXtoString as3.as`这个文件可能包含一个函数,用于将16进制字符串转换为ByteArray,以便于Socket通信。 在AS3中,使用Socket类的步骤如下: 1. **创建Socket实例**:首先,你需要创建一个Socket对象,例如`var ...

    java和as3 socket通信 解决安全沙箱问题

    Java和ActionScript 3 (AS3) 的Socket通信在实现跨平台交互时是常见的技术手段,尤其是在处理实时数据传输和游戏开发中。然而,由于AS3运行在Flash Player的沙箱环境中,它受到一系列安全限制,包括不能直接与非同一...

    flash actionscript3 as3通信 教程 socket与服务器通信, 多个swf之间通信.zip

    flash actionscript3 as3通信 教程 socket与服务器通信, 多个swf之间通信.zip

    flash actionscript3游戏开发之as3的socket通信方式介绍即使用XMLSocket.zip

    本文将深入探讨AS3中的Socket通信方式,特别是利用XMLSocket进行网络交互的细节。 首先,XMLSocket是AS3中用于低级网络通信的类,它提供了双向、全双工的数据流,适合于游戏开发中的实时数据交换,如玩家状态同步、...

    as3socket通信

    as3socket向服务器传输数据和接收服务器的数据,自己,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,...

    flash as3 socket编程基础

    ### Flash AS3 Socket编程基础知识详解 #### 一、引言 在现代互联网应用开发中,实时通信技术变得越来越重要。而Socket编程作为一种实现客户端与服务器之间实时数据交换的有效手段,在Flash开发领域同样占据着重要...

    as3_Socket_的简单实例

    总之,AS3的`Socket`类提供了一种直接与远程服务器进行TCP通信的能力,适合于需要自定义协议或低级别控制网络通信的场景。通过学习和理解TCP/IP协议以及应用层协议如POP3,开发者可以利用`Socket`类构建功能丰富的...

    socket通信异常解决总结

    Socket 通信异常解决总结 Socket 通信异常是指在网络通信过程中出现的各种错误和异常,包括网络连接断开、服务器端或客户端程序异常、网络链路异常等。这些异常会导致 Socket 连接断开,影响系统的稳定性和可靠性。...

    as3_socket

    建立Socket连接是任何Socket通信的基础。在AS3中,我们可以使用`Socket`或`XMLSocket`类来创建Socket实例,并调用`connect()`方法来尝试与服务器建立连接。 1. **确定服务器信息**: - **域名/IP地址**:需要知道...

    全AIR 的 Socket通信(air服务端、air客户端)

    Socket通信是网络编程的基础,它提供了两台计算机之间低级别的双向通信通道。 首先,让我们理解Socket的基本概念。Socket是一种网络通信协议,允许两台计算机通过TCP/IP协议进行通信。在AIR中,我们可以使用AS3的...

    AS3 Socket 基础知识(很全面) 1

    AS3 Socket基础知识是网络通信的重要组成部分,特别是在网络时代,它被广泛应用于各种应用程序中,因为“一切皆Socket”。网络进程间的通信需要一个唯一标识,TCP/IP协议族通过IP地址识别网络主机,结合传输层的...

    Flex 的socket通信

    这个文件可能是一个AS3脚本,包含了具体的Socket通信逻辑,如创建Socket对象、设置事件监听器等。 通过以上知识点,你可以理解并实现Flex中的Socket通信。实例代码如`ScoketClient.mxml`和`mySocket`可以帮助你更...

    AS3使用Socket的简单例子.txt

    - **AS3 Socket编程基础** - **创建与配置XMLSocket对象** - **事件监听器的设置与使用** - **连接服务器及发送数据** - **接收服务器响应** #### 知识点详细解析 ##### AS3 Socket编程基础 ActionScript 3.0 ...

    (AS3)socket+客户端与服务端+实例

    本文将深入探讨基于ActionScript 3(AS3)的Socket通信,包括客户端与服务端的交互,以及如何通过提供的实例来理解这一过程。我们将不涉及具体代码,而是详细解释相关的概念和技术要点。 首先,Socket是网络编程中...

    Flex_AS3与Java的Socket通信

    在本文中,我们将深入探讨Flex AS3与Java的Socket通信技术,这是一种允许Web应用程序(如Flash游戏)与服务器进行低级数据传输的方法。Flex AS3是Adobe开发的ActionScript 3.0编程语言的一个框架,它提供了丰富的...

    as3-java socket

    本文将深入探讨“as3-java socket”这个主题,这是关于使用ActionScript 3(AS3)与Java进行Socket通信的一个测试程序。AS3是Adobe Flash Platform的主要编程语言,而Java Socket API则是用于实现网络上的双向通信的...

    as3与java简单socket交互demo

    **AS3中的Socket通信** AS3是Adobe开发的脚本语言,主要用于Flash和Flex应用。在AS3中,我们可以使用`flash.net.Socket`类来建立TCP Socket连接。以下是一些关键知识点: 1. **初始化Socket对象**:首先,我们需要...

Global site tag (gtag.js) - Google Analytics