Beetle.NetPackage是一個多平台Client Socket TCP通訊組件(Apache License 2.0),組件制統一的對象協議制定規則,可以靈活方便地通過對象來描述TCP通訊交互。現有支持平台有Flash,.NET和Android。組件為了統一編寫規范制定了不同語言平台下訪問TCP服務的統一處理規則;分別有協議描述規范和消息處理控制。不同語言平台下都提供了一致的對象和接口主要包括:IMessage,Packge,INetClientHandler和NetClient等。
IMessage
消息描述接口,所有通訊消息必須實現相關規則。
flash
public class Register implements IMessage { public var Name:String; public var EMail:String; public var City:String; public var Country:String; public var RegTime:Date; public function Register() { } public function Load(reader:ByteArray):void { Name= reader.readUTF(); EMail= reader.readUTF(); City= reader.readUTF(); Country = reader.readUTF(); var dv:String= reader.readUTF(); RegTime=DateFormatter.parseDateString(dv); } public function Save(writer:ByteArray):void { writer.writeUTF(Name); writer.writeUTF(EMail); writer.writeUTF(City); writer.writeUTF(Country); var d:DateFormatter =new DateFormatter(); d.formatString="YYYY-MM-DD HH:NN:SS"; writer.writeUTF(d.format(RegTime)); } }
android
public class Register implements IMessage { public String Name; public String EMail; public String City; public String Country; public Date RegTime; @Override public void Load(DataInputStream stream) throws Exception { // TODO Auto-generated method stub Name = stream.readUTF(); EMail = stream.readUTF(); City = stream.readUTF(); Country = stream.readUTF(); String format = "yyyy-MM-dd HH:mm:ss"; SimpleDateFormat sdf = new SimpleDateFormat(format); RegTime = sdf.parse(stream.readUTF()); } @Override public void Save(DataOutputStream stream) throws Exception { // TODO Auto-generated method stub stream.writeUTF(Name); stream.writeUTF(EMail); stream.writeUTF(City); stream.writeUTF(Country); String format = "yyyy-MM-dd HH:mm:ss"; SimpleDateFormat sdf = new SimpleDateFormat(format); stream.writeUTF(sdf.format(RegTime)); } }
c#
public class Register:Beetle.NetPackage.IMessage { public String Name; public String EMail; public String City; public String Country; public DateTime RegTime; public void Load(Beetle.NetPackage.BufferStream reader) { Name = reader.ReadUTF(); EMail = reader.ReadUTF(); City = reader.ReadUTF(); Country = reader.ReadUTF(); string date = reader.ReadUTF(); Console.WriteLine(date); RegTime = DateTime.ParseExact(date, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); } public void Save(Beetle.NetPackage.BufferStream writer) { writer.WriteUTF(Name); writer.WriteUTF(EMail); writer.WriteUTF(City); writer.WriteUTF(Country); writer.WriteUTF(RegTime.ToString("yyyy-MM-dd HH:mm:ss")); } }
Package
該對象是用於通訊協議描述,默認實現4字節描述消息大小規范。Package的主要工作是對象寫入通訊數據和從通訊數據獲取對象。對象只是提供一個基礎的處理規則,在應用中使用者必須從此類的基礎上派生出新的協議處理對象。
flash
public class NPPackage extends Package { public function NPPackage() { super(); } protected override function WriteMessageType(writer:ByteArray, message:IMessage):void { writer.writeUTF(flash.utils.getQualifiedClassName(message)); } protected override function GetMessage(reader:ByteArray):IMessage { var name:String = reader.readUTF(); if(name=="Register") return new Register(); return null; } }
android
public class NPPackage extends Package { @Override protected void WriteMessageType(DataOutputStream writer, IMessage message) throws Exception { // TODO Auto-generated method stub writer.writeUTF(message.getClass().getSimpleName()); } @Override protected IMessage GetMessage(DataInputStream reader) throws Exception { // TODO Auto-generated method stub String name= reader.readUTF(); if(name.equals("Register")) return new Register(); return null; } }
c#
class NPPackage:Beetle.NetPackage.Package { protected override void WriteMessageType(Beetle.NetPackage.BufferStream writer, Beetle.NetPackage.IMessage message) { writer.WriteUTF(message.GetType().Name); } protected override Beetle.NetPackage.IMessage GetMessage(Beetle.NetPackage.BufferStream reader) { string Name = reader.ReadUTF(); switch (Name) { case "Register": return new Register(); } return null; } }
INetClientHandler
該接口主要用於描述TCP連接處理規則,包括有數據接收事件,錯誤處理事件,連接創建成功和失敗事件。
public interface INetClientHandler { void Receive(NetClient client, Object msg); void Error(NetClient client, Exception e); void Disposed(NetClient client); void Connected(NetClient client); }
NetClient
該對象主要用於創建TCP通訊和進行消息發送接收處理。
flash
mClient = new NetClient("127.0.0.1",9088,new NPPackage(),new NetClientHandler( ClientReceive,ClientError,ClientDisposed,ClientConnected)); mClient.SocketEndian = Endian.BIG_ENDIAN; mClient.Connect();
android
mClient = new NetClient("10.0.2.2", 9088, new NPPackage(), this); mClient.Connect();
c#
mClient = new Beetle.NetPackage.NetClient("127.0.0.1", 9088, new NPPackage(), this); mClient.LittleEndian = false; mClient.Connect();