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);
}
}
}
客户端分段读取服务端的socket信息 客户端连接多台socket服务端
最新推荐文章于 2023-10-13 08:38:23 发布