/game_client/src/com/jediflasher/game_client/server/ServerConnector.as

http://mmorpg-client-server-learning.googlecode.com/ · ActionScript · 193 lines · 113 code · 36 blank · 44 comment · 4 complexity · e8e374b9082a6e10a6d0313c4e522bc0 MD5 · raw file

  1. /**
  2. * User: Obi
  3. * Date: 31.07.11
  4. * Time: 14:38
  5. */
  6. package com.jediflasher.game_client.server {
  7. import com.jediflasher.game_client.events.server.ServerConnectorEvent;
  8. import com.jediflasher.game_client.server.messages.Header;
  9. import com.jediflasher.game_client.utils.logging.Logger;
  10. import com.jediflasher.game_client.utils.logging.LoggerEvent;
  11. import com.jediflasher.game_client.utils.logging.LoggerMessageLevel;
  12. import com.netease.protobuf.Message;
  13. import flash.events.Event;
  14. import flash.events.EventDispatcher;
  15. import flash.events.IOErrorEvent;
  16. import flash.events.ProgressEvent;
  17. import flash.events.SecurityErrorEvent;
  18. import flash.net.Socket;
  19. import flash.system.Security;
  20. import flash.system.System;
  21. import flash.utils.ByteArray;
  22. [Event(name="connect", type="com.jediflasher.game_client.events.server.ServerConnectorEvent")]
  23. [Event(name="error", type="com.jediflasher.game_client.events.server.ServerConnectorEvent")]
  24. [Event(name="disconnect", type="com.jediflasher.game_client.events.server.ServerConnectorEvent")]
  25. [Event(name="messageReceived", type="com.jediflasher.game_client.events.server.ServerConnectorEvent")]
  26. public class ServerConnector extends EventDispatcher {
  27. private static var _requestCounter:int = 1;
  28. public function ServerConnector(host:String, port:int, policyPort:int) {
  29. var pAddr:String = "http://"+host+":"+policyPort;
  30. // var pAddr:String = "xmlsocket://"+host+":"+policyPort;
  31. Security.allowDomain(host);
  32. Logger.log("Allow domain "+host);
  33. Security.loadPolicyFile(pAddr);
  34. Logger.log("Loading policy file from "+pAddr);
  35. this._host = host;
  36. this._port = port;
  37. this.initSocket();
  38. }
  39. /**
  40. * @private
  41. */
  42. private var _socket:Socket;
  43. /**
  44. * @private
  45. */
  46. private var _host:String;
  47. /**
  48. * @private
  49. */
  50. private var _port:int;
  51. /**
  52. * @private
  53. */
  54. private var _currentMessageLength:int = -1;
  55. public function send(messageType:int, serviceType:int, methodType:int, message:Message, requestId:int):void {
  56. var messageByteArray:ByteArray = new ByteArray();
  57. message.writeTo(messageByteArray);
  58. var header:Header = new Header();
  59. header.messageType = messageType;
  60. header.serviceType = serviceType;
  61. header.method = methodType;
  62. header.requestId = requestId;
  63. header.bodySize = messageByteArray.length;
  64. messageByteArray = new ByteArray();
  65. header.writeTo(messageByteArray);
  66. var headerSize:int = messageByteArray.length;
  67. message.writeTo(messageByteArray);
  68. var bytesToSend:ByteArray = new ByteArray();
  69. bytesToSend.writeInt(messageByteArray.length + 4); // ????????? 4 ????? – ????? ?????????
  70. bytesToSend.writeInt(headerSize);
  71. bytesToSend.writeBytes(messageByteArray);
  72. Logger.log("======== output =======");
  73. Logger.log("header >\n" + header);
  74. Logger.log("message >\n" + message.toString());
  75. Logger.log("totalBytes: " + bytesToSend.length + "\n");
  76. this._socket.writeBytes(bytesToSend);
  77. this._socket.flush();
  78. }
  79. /**
  80. * ?????????? ?????????? ?????????????, ?? ???????? ????? ????????? ??????
  81. * @return ?????????? ????????????? ???????
  82. */
  83. public static function getRequestId():int {
  84. return _requestCounter++;
  85. }
  86. /**
  87. * @private
  88. */
  89. private function initSocket():void {
  90. this._socket = new Socket();
  91. this._socket.addEventListener(Event.CONNECT, this.handler_connect);
  92. this._socket.addEventListener(IOErrorEvent.IO_ERROR, this.handler_ioError);
  93. this._socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, this.handler_securityError);
  94. this._socket.addEventListener(Event.CLOSE, this.handler_close);
  95. this._socket.addEventListener(ProgressEvent.SOCKET_DATA, this.handler_socketData);
  96. this._socket.connect(this._host, this._port);
  97. trace("Socket init with host:", this._host + ":" + this._port);
  98. }
  99. /**
  100. * @private
  101. */
  102. private function parseMessage():void {
  103. var totalBytes:int = this._socket.bytesAvailable;
  104. var messageWrapper:MessageWrapper = new MessageWrapper().read(this._socket);
  105. Logger.log("======== input =======");
  106. Logger.log(messageWrapper.toString());
  107. Logger.log("totalBytes: " + totalBytes + "\n");
  108. this.parsingComplete(messageWrapper);
  109. }
  110. private function parsingComplete(messageWrapper:MessageWrapper):void {
  111. super.dispatchEvent(new ServerConnectorEvent(ServerConnectorEvent.MESSAGE_RECEIVED, messageWrapper));
  112. }
  113. /**
  114. * @private
  115. */
  116. private function handler_connect(event:Event):void {
  117. Logger.log("Connected to server");
  118. super.dispatchEvent(new ServerConnectorEvent(ServerConnectorEvent.CONNECT));
  119. }
  120. /**
  121. * @private
  122. */
  123. private function handler_securityError(event:SecurityErrorEvent):void {
  124. Logger.log("securityError: "+ event.text, LoggerMessageLevel.ERROR);
  125. super.dispatchEvent(new ServerConnectorEvent(ServerConnectorEvent.ERROR));
  126. }
  127. /**
  128. * @private
  129. */
  130. private function handler_ioError(event:IOErrorEvent):void {
  131. Logger.log("i/o error: "+ event.text, LoggerMessageLevel.ERROR);
  132. super.dispatchEvent(new ServerConnectorEvent(ServerConnectorEvent.ERROR));
  133. }
  134. /**
  135. * @private
  136. */
  137. private function handler_close(event:Event):void {
  138. Logger.log("Connection closed");
  139. super.dispatchEvent(new ServerConnectorEvent(ServerConnectorEvent.DISCONNECT));
  140. }
  141. /**
  142. * @private
  143. */
  144. private function handler_socketData(event:ProgressEvent):void {
  145. while(this._socket.bytesAvailable > 0 && this._socket.bytesAvailable >= this._currentMessageLength) {
  146. // ????? ?????????
  147. if (this._currentMessageLength == -1) {
  148. this._currentMessageLength = this._socket.readInt();
  149. }
  150. if (this._socket.bytesAvailable >= this._currentMessageLength) {
  151. this.parseMessage();
  152. this._currentMessageLength = -1;
  153. }
  154. }
  155. }
  156. }
  157. }