笔记者;听课、听报告、读书时所做的记录;一种以随笔记录为主的著作体裁,多由分条的短篇汇集而成。我本愚钝,看书做笔记,然后敲例子,一字一句从新在头脑里在手里组织一遍,好像效果的确不一样,不是Ctrl+C->Ctrl+V,仅当笔记,老来忘记了,可以翻一翻,看一看,仅此而已。
代码+详尽的注释,这样写比较好理解,今后就这样写好了——|||...
7: 关闭Socket
Socket连接任务完成后,需及时关闭,以释放资源.
主动关闭: Socket.close() XMLSocket.close()
服务器端关闭Socket, 将引发CLOSE事件,我们可以注册一个函数进行处理
8: 关于握手
import flash.events.ProgressEvent; import flash.net.Socket; import flash.utils.ByteArray; import mx.controls.Alert; //描述协议状态的常量(创建不同的常量来声明协议的状态.使用这些常量将指定的处理函数映射到相应的状态.在一个socketData事件控制器中,通过状态映射调用这些函数的) public const DETERMINE_VERSION:int = 0; //读取版本号状态 public const RECEIVE_CHALLENGE:int = 1; //读取鉴定码状态 public const NORMAL:int = 2; //读取常规操作状态 // 状态处理函数映射对象 private var StateFuns:Object; // 当前连接状态 private var CurrentPCState:int; //Socket private var mySocket:Socket; //Socket连接 protected function BT_SKConnectClick(event:MouseEvent):void { SKConnectServer(); } //Socket 连接服务器 private function SKConnectServer():void{ try{ // 初始化状态处理函数映射对象以及Socket的连接状态 StateFuns = new Object( ); StateFuns[DETERMINE_VERSION] = ReadVersion; StateFuns[RECEIVE_CHALLENGE] = ReadChallenge; StateFuns[NORMAL ] = ReadNormalProtocol; CurrentPCState = DETERMINE_VERSION; //建立socket mySocket = new Socket(); mySocket.addEventListener(Event.CONNECT,mySocketOnConnect); mySocket.addEventListener(IOErrorEvent.IO_ERROR,mySocketOnError); mySocket.addEventListener(Event.CLOSE,mySocketOnClose); mySocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,mySocketOnSecurityError); mySocket.addEventListener(ProgressEvent.SOCKET_DATA,mySocketOnDataGet); // 连接 mySocket.connect( TI_SKIPAddress.text, int(TI_SKPort.text) ); }catch(ex:Error){} } //Socket连接成功 private function mySocketOnConnect( event:Event ):void { Alert.show("Socket已经连接."); } //Socket连接失败 private function mySocketOnError( event:Event ):void { Alert.show("Socket连接失败."); } //服务端断开Socket服务引发的Close事件 private function mySocketOnClose(event:Event):void{ Alert.show("服务器断开了Socket连接,无法发送数据,需重新建立连接"); } //安全错误 private function mySocketOnSecurityError( event:Event ):void { Alert.show("发生SecurityError."); } //Socket发送数据 protected function BT_SKSendclick(event:MouseEvent):void { if(mySocket.connected){ try{ mySocket.writeUTFBytes(this.TI_SKSend.text); mySocket.flush() }catch(error:IOError){ //如果socket还没有连接就发送会抛出一个类型为 IOError的错误 } }else{ SKConnectServer(); } } //Socket获取数据 private function mySocketOnDataGet( event:ProgressEvent ):void { //与服务器进行握手,并确定收到了什么样的数据和如何处理这些数据 var processFunc:Function = StateFuns[CurrentPCState]; processFunc(); //this.TA_SocketGet.appendText("Socket received " + mySocket.bytesAvailable + " byte(s) of data:/r/n"); /*while(mySocket.bytesAvailable){ var msg:String = mySocket.readUTFBytes(mySocket.bytesAvailable); this.TA_SocketGet.appendText(msg+"/r/n"); }*/ } //读取版本号状态处理函数 private function ReadVersion():void { // 1) 当与服务器连接的时候,服务器立刻返回一个标志服务器可以支持的最高协议版本号的整数值 var version:int = mySocket.readInt(); Alert.show("握手: 1)连接后,Flex端接收到服务器返回的支持最高协议号版本 "+version.toString()); // 一旦接收了版本号,就开接收下一个状态了 CurrentPCState = RECEIVE_CHALLENGE; // 2) 客户端在响应的时候会返回一个实际使用协议的版本号给服务器 mySocket.writeInt(version); mySocket.flush(); } //读取鉴定码状态处理函数 private function ReadChallenge():void { // 3) 服务器返回一个8byte的鉴定码 //在鉴定码中可包含更多的安全响应.可通过发送各种加密方法的密匙来代替逐个发送的鉴定码.这通常使用在客户端向用户索要密码的时候, //然后密码成为了加密过的8byte鉴定码.该加密过的鉴定码接着返回到服务器.如果响应的鉴定码匙服务器所期望的,客户端就知道该密码是正确的, //然后同意建立连接 var bytes:ByteArray = new ByteArray(); mySocket.readBytes(bytes,0,8 ); Alert.show("握手: 3)Flex端接收到服务器返回的鉴定码:"+bytes.toString()); // 一旦接收了鉴定码,状态就变成Normal CurrentPCState = NORMAL; // 4)后客户端将这鉴定码返回到服务器 mySocket.writeBytes(bytes); mySocket.flush(); } //读取常规操作状态处理函数 private function ReadNormalProtocol():void { // 5) 如果客户端的响应不是服务器端所期望的,或者,就在这个时候该协议变成了一个常规操作模式,于是握手结束 while(mySocket.bytesAvailable){ var msg:String = mySocket.readUTFBytes(mySocket.bytesAvailable); this.TA_SocketGet.appendText(msg+"/r/n"); } }