• 20-07-2014, 18:57:19
    #1
    Server Client sistemlerinde genelde çok kaba taslak packetler yapılıyor hatta packet içeriklerini string olarak atarlar packeti parçalamak için char kullanılıyor.
    Kendi sistemim için yazdığım classları vermek istiyorum.

    public abstract class Packet
    {
    	protected MemoryStream Buffer;
    	public PacketType Opcode { get; set; }
    	public byte[] ToArray()
    	{
    		return Buffer.ToArray();
    	}
    }
    
    public class PacketReader : Packet
    {
        private readonly BinaryReader Reader;
        public long Lenght { get { return Buffer.Length; } }
        public long Position
        {
            get { return Buffer.Position; }
            set { Buffer.Position = value; }
        }
        public PacketReader(byte[] Data)
        {
            Buffer = new MemoryStream(Data, false);
            Reader = new BinaryReader(Buffer, Encoding.Default);
            Opcode = (PacketType)ReadByte();
        }
        public void Reset(int length)
        {
            Buffer.Seek(length, SeekOrigin.Begin);
        }
        public void Skip(int length)
        {
            Buffer.Position += length;
        }
        public byte ReadByte()
        {
            return Reader.ReadByte();
        }
        public byte[] ReadBytes(int Count)
        {
            return Reader.ReadBytes(Count);
        }
        public bool ReadBool()
        {
            return Reader.ReadBoolean();
        }
        public short ReadShort()
        {
            return Reader.ReadInt16();
        }
        public int ReadInt()
        {
            return Reader.ReadInt32();
        }
        public long ReadLong()
        {
            return Reader.ReadInt64();
        }
        public string ReadString()
        {
            return Reader.ReadString();
        }
    }
    
    public class PacketWriter : Packet
    {
        private readonly BinaryWriter Writer;
        public long Lenght { get { return Buffer.Length; } }
        public long Position
        {
            get { return Buffer.Position; }
            set { Buffer.Position = value; }
        }
        public PacketWriter(PacketType OpCode)
        {
            Buffer = new MemoryStream(0);
            Writer = new BinaryWriter(Buffer, Encoding.Default);
            Opcode = OpCode;
            Writer.Write((byte)Opcode);
        }
        public void Reset(int length)
        {
            Buffer.Seek(length, SeekOrigin.Begin);
        }
        public void WriteByte(byte _Byte)
        {
            Writer.Write(_Byte);
        }
        public void WriteBytes(byte[] _Byte)
        {
            Writer.Write(_Byte);
        }
        public void WriteBool(bool _Bool)
        {
            Writer.Write(_Bool);
        }
        public void WriteShort(short _Short)
        {
            Writer.Write(_Short);
        }
        public void WriteInt(int _Int)
        {
            Writer.Write(_Int);
        }
        public void WriteLong(long _Long)
        {
            Writer.Write(_Long);
        }
        public void WriteString(string _String)
        {
            Writer.Write(_String);
        }
    }
    
    public enum PacketType
    {
    	Login = 1,
    	Message = 2,
    	Exit = 3,
    }
    Socket Gönderimi Örnek :
    public void Send(Packet Pkt)
    {
    	if (Socket.Connected)
    	{
    		Socket.Send(Pkt.ToArray());
    	}
    }
    Kullanımı :
    PacketWriter Result = new PacketWriter(PacketType.Login);
    Result.WriteString("Test");
    Result.WriteString("123456");
    Send(Result);
    // Client varsayıp packeti okuma örnek olarak.
    PacketReader Pkt = new PacketReader(Result.ToArray());
    Console.WriteLine(string.Format("ID : {0} , Şifre : {1}", Pkt.ReadString(), Pkt.ReadString()));
  • 20-07-2014, 21:06:05
    #2
    http://code.google.com/p/protobuf/

    bunu da kullanabilirsiniz.


    Nasıl kullanıldığını şu videolardan öğrenebilirsin.


    Part1

    Part2