客户端分段读取服务端的socket信息 客户端连接多台socket服务端

9 篇文章 0 订阅
package helper.socket
{
	
	import config.ConfigVar;
	
	import flash.errors.IOError;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IOErrorEvent;
	import flash.events.ProgressEvent;
	import flash.events.SecurityErrorEvent;
	import flash.net.Socket;
	
	import helper.HH_Fun;
	
	
	public class PHPSocket extends EventDispatcher
	{
		private var mSocket:Socket;
		protected var mDone : Boolean = true;
		private var mAddr : String;
		private var mPort : int;
		private var _typeKey:String;
		public function PHPSocket(typeKey:String)
		{
			connMoreSocket(typeKey);
		}
		
		/**连接多台socket服务器*/
		private function connMoreSocket(typeKey:String):void
		{
			//普通类型socket通信
			_typeKey = typeKey
			if(typeKey=="comm")
			{
				startConnection("192.168.1.222",8080);
				trace("普通类型的socket 通信地址为: "+ConfigVar.commSocketIPArr[0]+" 端口号为: "+ConfigVar.commSocketIPArr[1]);
			}
			//聊天系统socket通信
			if(typeKey=="chat")
			{
				startConnection("192.168.1.333",8000);
				trace("聊天系统的socket 通信地址为: "+ConfigVar.chatSocketIPArr[0]+" 端口号为: "+ConfigVar.chatSocketIPArr[1]);
			}
		}
		
		/**普通类型socket连接*/
		private static var instance:PHPSocket;
		public static function init():PHPSocket
		{
			if ( instance == null ) 
			{
				instance = new PHPSocket("comm");
			}
			return instance;
		}
		
		/**聊天系统socket连接*/
		private static var chatInstanceVal:PHPSocket;
		public static function chatInstance():PHPSocket
		{
			if ( chatInstanceVal == null ) 
			{
				chatInstanceVal = new PHPSocket("chat");
			}
			return chatInstanceVal;
		}
		
		//-----------------------------------------------------------------------------------------------------------------------------------------
		
		/**开始链接*/
		public function startConnection(addr : String, port : int) : void 
		{
			mAddr = addr;
			mPort = port;
			
			mDone = false;
			mSocket = new Socket();
			
			mSocket.addEventListener(Event.CONNECT, notifyConnected);   //连接成功之后,首先发送一条信息
			mSocket.addEventListener(Event.CLOSE, notifyDisconnected);
			mSocket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
			mSocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
			mSocket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
			
			try 
			{
				mSocket.connect(mAddr, mPort);
			}
			catch (e : SecurityError) {
				trace(e.getStackTrace());
			}
		}
		
		
		/**向socket服务器发送数据*/
		public function sendPacketToServer(msg:String,keyStr:String,connTime:int=0) : void 
		{
			if (mSocket && mSocket.connected) 
			{
				try 
				{
					mSocket.writeUnsignedInt(HH_Fun.instance().GetStringLength(msg.toString()));
					mSocket.writeUTFBytes(msg);
					trace("成功发送信息到socket服务端: "+msg);
				} 
				catch (e : IOError) {
					trace("客户端向服务端信息发送失败: "+e.getStackTrace());
				}
			}
			else 
			{
			}
		}
		
		/**分段接收读取从socket服务器端发送过来的数据*/
		private var ss_isReadStr:Boolean = false;
		private var ss_msgLength:int=0;
		private var ss_readedMsg:String="";
		
		private function socketDataHandler(event : ProgressEvent) : void 
		{
			trace("服务端有信息发往客户端");
			
			//判断是读取新数据还是在读取老数据, false读取新数据
			if(ss_isReadStr==false)
			{
				readHaveHeader();
			}
				//只读取字符串
			else
			{
				readFun();
			}
			
		}
		
		/**读取socket信息头部*/
		private function readHaveHeader():void
		{
			ss_msgLength = mSocket.readInt();
			ss_isReadStr = true;
			readFun();
		}
		
		/**读取消息函数,此函数执行时,已经将信息头读出*/
		private function readFun():void
		{
			var thisMsgLength:int = mSocket.bytesAvailable;
			if(thisMsgLength > 0 )
			{
				//读取序列化后的数据包
				var readLength:int = (thisMsgLength >= ss_msgLength) ? ss_msgLength : thisMsgLength;
				ss_readedMsg += mSocket.readUTFBytes(readLength);
				ss_msgLength -= readLength;
				
				//读取完毕发送
				if(ss_msgLength==0)
				{
					//读取完毕发送
					SToC(ss_readedMsg);
					ss_isReadStr = false;
					ss_readedMsg = "";
					ss_msgLength=0;
					
					//如果还有剩下的信息,继续读头
					if(mSocket.bytesAvailable>0)
					{
						readHaveHeader();
					}
				}
			}
		}
		
		/**模拟服务端发送信息到客户端*/
		public function SToC(str:String):void
		{
			var e:EESocket = new EESocket(EESocket.SOCKET);
			e.msg = str;
			dispatchEvent(e);
		}
		
		
		
		//连接socket时存在的错误----------------------------------------------------------------------
		protected function notifyConnected(event : Event) : void
		{
			trace("连上服务器啦!!");
			//sendPacketToServer("<policy-file-request/>");
		}
		protected function notifyDisconnected(evt : Event) : void 
		{
			trace("服务器断开!");
		}
		private function ioErrorHandler(event : IOErrorEvent) : void 
		{
			trace("报头链接错误 ioErrorHandler:"+"  port: "+mPort +"  "+ event.text);
		}
		private function securityErrorHandler(event : SecurityErrorEvent) : void 
		{
			trace("沙箱错误  securityErrorHandler:"+"  port: "+mPort +"  "+ event.text);
		}
		
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值