Advertisement
Guest User

asfasfasfasf

a guest
Feb 24th, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.35 KB | None | 0 0
  1. using Game.NetLib.Events;
  2. using Game.NetLib.Packets;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Net.Sockets;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10.  
  11. namespace Game.NetLib
  12. {
  13.     public class PacketStream : IDisposable
  14.     {
  15.         private readonly PacketStreamReader _reader;
  16.         private readonly PacketStreamWriter _writer;
  17.         private readonly Stream _stream;
  18.         private readonly Dictionary<int, Func<PacketStreamReader, Task<PacketBase>>> _readerStrategies = new Dictionary<int, Func<PacketStreamReader, Task<PacketBase>>>();
  19.         private readonly Dictionary<int, Action<PacketStreamWriter, Task<PacketBase>>> _writerStrategies = new Dictionary<int, Action<PacketStreamWriter, Task<PacketBase>>>();
  20.  
  21.         private readonly PacketBase _emptyPacket = new EmtpyPacket();
  22.  
  23.         public PacketStream(Stream stream)
  24.         {
  25.             _stream = stream;
  26.             _reader = new PacketStreamReader(stream, Encoding.UTF8);
  27.             _writer = new PacketStreamWriter(stream, Encoding.UTF8);
  28.         }
  29.  
  30.         public async Task Write(PacketBase packet)
  31.         {
  32.             if (!_writerStrategies.ContainsKey(packet.PacketTypeId))
  33.             {
  34.                 throw new InvalidOperationException();
  35.             }
  36.             await _writer.WriteAsync(packet.PacketTypeId);
  37.             _writerStrategies[packet.PacketTypeId](_writer, packet);
  38.         }
  39.  
  40.         public async Task<PacketBase> Read()
  41.         {
  42.             var packetTypeId = await _reader.ReadInt32Async();
  43.  
  44.             if (!_readerStrategies.ContainsKey(packetTypeId))
  45.             {
  46.                 throw new InvalidOperationException();
  47.             }
  48.             return _readerStrategies[packetTypeId](_reader);
  49.         }
  50.  
  51.         public void Register<T>(int identifier, Func<PacketStreamReader, T, Task<T>> reader, Action<PacketStreamWriter, T> writer) where T : PacketBase, new()
  52.         {
  53.             if (_readerStrategies.ContainsKey(identifier) || _writerStrategies.ContainsKey(identifier))
  54.             {
  55.                 throw new InvalidOperationException();
  56.             }
  57.             _readerStrategies.Add(identifier, async (binaryReader) => await reader(_reader, new T()));
  58.             _writerStrategies.Add(identifier, async (binaryReader, packetBase) => await writer(_writer, (T)packetBase));
  59.         }
  60.  
  61.         public void Dispose()
  62.         {
  63.             _reader.Dispose();
  64.             _writer.Dispose();
  65.             _stream.Dispose();
  66.         }
  67.     }
  68. }
  69.  
  70. using Game.NetLib.Packets;
  71. using System;
  72. using System.Collections.Generic;
  73. using System.IO;
  74. using System.Linq;
  75. using System.Net.Sockets;
  76. using System.Text;
  77. using System.Threading.Tasks;
  78.  
  79. namespace Game.NetLib
  80. {
  81.     public class PacketStreamFactory
  82.     {
  83.         public static PacketStream CreateLoginServerPacketStream(NetworkStream stream)
  84.         {
  85.             var packetStream = new PacketStream(stream);
  86.             packetStream.Register<Task<LoginPacket>>((int)PacketType.LOGIN, Read, Write);
  87.             packetStream.Register<Task<StatusPacket>>((int)PacketType.STATUS, Read, Write);
  88.             return packetStream;
  89.         }
  90.  
  91.         public static PacketStream CreateLobbyPacketStream(NetworkStream stream)
  92.         {
  93.             var packetStream = new PacketStream(stream);
  94.             packetStream.Register<ChatMessagePacket>((int)PacketType.CHAT_MESSAGE, Read, Write);
  95.             packetStream.Register<CreateRoomPacket>((int)PacketType.CREATE_ROOM, Read, Write);
  96.             packetStream.Register<StatusPacket>((int)PacketType.STATUS, Read, Write);
  97.             return packetStream;
  98.         }
  99.  
  100.         #region LOGIN
  101.         private static async Task Write(PacketStreamWriter binaryWriter, LoginPacket loginPacket)
  102.         {
  103.             await binaryWriter.WriteAsync(loginPacket.Username);
  104.             await binaryWriter.WriteAsync(loginPacket.Password);
  105.         }
  106.  
  107.         private static async Task<LoginPacket> Read(PacketStreamReader binaryReader, LoginPacket loginPacket)
  108.         {
  109.             loginPacket.Username = await binaryReader.ReadStringAsync();
  110.             loginPacket.Password = await binaryReader.ReadStringAsync();
  111.             return loginPacket;
  112.         }
  113.         #endregion
  114.  
  115.         #region CHATMESSAGE
  116.         private static async Task Write(PacketStreamWriter binaryWriter, ChatMessagePacket chatMessagePacket)
  117.         {
  118.             await binaryWriter.WriteAsync(chatMessagePacket.From);
  119.             await binaryWriter.WriteAsync(chatMessagePacket.Body);
  120.             await binaryWriter.WriteAsync(chatMessagePacket.To);
  121.         }
  122.  
  123.         private static async Task<ChatMessagePacket> Read(PacketStreamReader binaryReader, ChatMessagePacket chatMessagePacket)
  124.         {
  125.             chatMessagePacket.From = await binaryReader.ReadInt32Async();
  126.             chatMessagePacket.Body = await binaryReader.ReadStringAsync();
  127.             chatMessagePacket.To = await binaryReader.ReadInt32Async();
  128.             return chatMessagePacket;
  129.         }
  130.         #endregion
  131.  
  132.         #region CREATEROOM
  133.         private static async Task Write(PacketStreamWriter binaryWriter, CreateRoomPacket createRoomPacket)
  134.         {
  135.             await binaryWriter.WriteAsync(createRoomPacket.Name);
  136.             await binaryWriter.WriteAsync(createRoomPacket.Capacity);
  137.             await binaryWriter.WriteAsync(createRoomPacket.Protected);
  138.             await binaryWriter.WriteAsync(createRoomPacket.Password);
  139.         }
  140.  
  141.         private static async Task<CreateRoomPacket> Read(PacketStreamReader binaryReader, CreateRoomPacket createRoomPacket)
  142.         {
  143.             createRoomPacket.Name = await binaryReader.ReadStringAsync();
  144.             createRoomPacket.Capacity = await binaryReader.ReadInt32Async();
  145.             createRoomPacket.Protected = await binaryReader.ReadBooleanAsync();
  146.             createRoomPacket.Password = await binaryReader.ReadStringAsync();
  147.             return createRoomPacket;
  148.         }
  149.         #endregion
  150.  
  151.         #region STATUS
  152.         private static async Task Write(PacketStreamWriter binaryWriter, StatusPacket errorPacket)
  153.         {
  154.             await binaryWriter.WriteAsync((int)errorPacket.StatusCode);
  155.             await binaryWriter.WriteAsync(errorPacket.Message);
  156.         }
  157.  
  158.         private static async Task<StatusPacket> Read(PacketStreamReader binaryReader, StatusPacket errorPacket)
  159.         {
  160.             errorPacket.StatusCode = (Status)await binaryReader.ReadInt32Async();
  161.             errorPacket.Message = await binaryReader.ReadStringAsync();
  162.             return errorPacket;
  163.         }
  164.         #endregion
  165.     }
  166. }
  167.  
  168. using System;
  169. using System.Collections.Generic;
  170. using System.IO;
  171. using System.Linq;
  172. using System.Text;
  173. using System.Threading.Tasks;
  174.  
  175. namespace Game.NetLib
  176. {
  177.     public class PacketStreamWriter : IDisposable
  178.     {
  179.         private Stream _stream;
  180.         private Encoding _encoding;
  181.        
  182.         public PacketStreamWriter(Stream stream) : this(stream, Encoding.UTF8) { }
  183.  
  184.         public PacketStreamWriter(Stream stream, Encoding encoding)
  185.         {
  186.             _stream = stream;
  187.             _encoding = encoding;
  188.         }
  189.  
  190.         public async Task WriteAsync(Int16 value)
  191.         {
  192.             var buffer = BitConverter.GetBytes(value);
  193.             await WriteBytesAsync(buffer);
  194.         }
  195.  
  196.         public async Task WriteAsync(Int32 value)
  197.         {
  198.             var buffer = BitConverter.GetBytes(value);
  199.             await WriteBytesAsync(buffer);
  200.         }
  201.  
  202.         public async Task WriteAsync(double value)
  203.         {
  204.             var buffer = BitConverter.GetBytes(value);
  205.             await WriteBytesAsync(buffer);
  206.         }
  207.  
  208.         public async Task WriteAsync(bool value)
  209.         {
  210.             var buffer = BitConverter.GetBytes(value);
  211.             await WriteBytesAsync(buffer);
  212.         }
  213.  
  214.         public async Task WriteAsync(string value)
  215.         {
  216.             var contentBuffer = _encoding.GetBytes(value);
  217.             var lengthBuffer = BitConverter.GetBytes(contentBuffer.Length);
  218.             await WriteBytesAsync(lengthBuffer);
  219.             await WriteBytesAsync(contentBuffer);
  220.         }
  221.  
  222.         private async Task WriteBytesAsync(byte[] buffer)
  223.         {
  224.             await _stream.WriteAsync(buffer, 0, buffer.Length);
  225.         }
  226.  
  227.         public void Dispose()
  228.         {
  229.             _stream.Dispose();
  230.         }
  231.     }
  232. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement