多平台Client TCP通訊組件


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();


 

項目站點:https://beetlenp.codeplex.com/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM