Advertisement
livolickie

C# Server

Jan 18th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.78 KB | None | 0 0
  1. //Тут если подключился новый клиент
  2. private void AsyncAcceptCompleted(object sender, SocketAsyncEventArgs e) //When who connected
  3.         {
  4.             try
  5.             {
  6.                 //Заново идем принимать новые подключения
  7.                 AsyncAccept();
  8.                 Socket newSock = e.AcceptSocket;
  9.                 if (newSock != null)
  10.                 {
  11.                     Buffer buffer = new Buffer();
  12.                     var checkIp = players.AsParallel().Where(player => (player.socket.RemoteEndPoint as IPEndPoint).Address.ToString() == (newSock.RemoteEndPoint as IPEndPoint).Address.ToString());
  13.                    /* if (checkIp.Count() != 0)
  14.                     {
  15.                         buffer.writer.Write((short)2);
  16.                         newSock.Send(buffer.memory.ToArray());
  17.                         buffer.Clear();
  18.                         Console.WriteLine("Попытка множественного подключения с " + (newSock.RemoteEndPoint as IPEndPoint).Address);
  19.                         newSock.Dispose();
  20.                         return;
  21.                     }*/
  22.                     Player p = new Player(newSock,getId()); //Создаем нового игрока
  23.                     players.Add(p);;
  24.                     Console.WriteLine("New connection from " + (newSock.RemoteEndPoint as IPEndPoint).Address);
  25.                     buffer.WriteByte(0);
  26.                     buffer.WriteIn16(p.id);
  27.                     p.socket.Send(buffer.memory.ToArray());
  28.                     buffer.Clear();
  29.                     AsyncReceive(p); //Принимаем от этого клиента данные
  30.                 }
  31.                 e.Dispose();
  32.             }
  33.             catch (Exception ex)
  34.             {
  35.                 Console.WriteLine(ex);
  36.                 e.Dispose();
  37.             }
  38.         }
  39.  
  40. //Запускаем асинхронную операцию для ожидания данных от сокета
  41. private void AsyncReceive(Player player)
  42.         {
  43.             try
  44.             {
  45.                 if (player.socket.Connected)
  46.                 {
  47.                     SocketAsyncEventArgs e = new SocketAsyncEventArgs();
  48.                     e.Completed += AsyncReceiveCompleted;
  49.                     e.SetBuffer(player.data, 0, player.data.Length);
  50.                     player.socket.ReceiveAsync(e);
  51.                 }
  52.                 else
  53.                 {
  54.                     IdMap[player.id] = -1;
  55.                     lock (players)
  56.                         players.Remove(player);
  57.                     Console.WriteLine("{0} disconnected", (player.socket.RemoteEndPoint as IPEndPoint).Address);
  58.                 }
  59.             }
  60.             catch (Exception ex)
  61.             {
  62.                 Console.WriteLine(ex);
  63.             }
  64.         }
  65. //Если пришли данные
  66. private void AsyncReceiveCompleted(object sender, SocketAsyncEventArgs e)
  67.         {
  68.             try
  69.             {
  70.                 Player player = FindPlayer(sender as Socket);
  71.                 if (!player.socket.Connected)
  72.                 {
  73.                     IdMap[player.id] = -1;
  74.                     lock (players)
  75.                         players.Remove(player);
  76.                     Console.WriteLine("{0} disconnected", (player.socket.RemoteEndPoint as IPEndPoint).Address);
  77.                     e.Dispose();
  78.                     return;
  79.                 }
  80.                 SocketAsyncEventArgs sendAsyncEvent = new SocketAsyncEventArgs();
  81.                 sendAsyncEvent.Completed += SendAsyncCompleted;
  82.                 Buffer buffer = new Buffer();
  83.                 Buffer buff = new Buffer(e.Buffer);
  84.                 bool disconnected = false;
  85.                 int count = 0;
  86.                 do
  87.                 {
  88.                     count++;
  89.                     byte message_id = buff.ReadByte();
  90.                     switch (message_id)
  91.                     {
  92.                         case 0: //Получаем имя игрока
  93.                             string name = buff.ReadString();
  94.                             player.Init(name, gameplay.spawnX, gameplay.spawnY, gameplay.startDirection);
  95.                             buffer.WriteByte(3);
  96.                             buffer.WriteIn16(player.id);
  97.                             buffer.WriteInt32(player.x);
  98.                             buffer.WriteInt32(player.y);
  99.                             buffer.WriteDouble(player.direction);
  100.                             buffer.WriteString(player.username);
  101.                             SendAll(buffer.memory.ToArray());
  102.                             buffer.SeekStart();
  103.                             buffer.WriteByte(4);
  104.                             buffer.WriteInt32(players.Count - 1);
  105.                             foreach (var p in players)
  106.                             {
  107.                                 if (p.id != player.id)
  108.                                 {
  109.                                     buffer.WriteIn16(p.id);
  110.                                     buffer.WriteInt32(p.x);
  111.                                     buffer.WriteInt32(p.y);
  112.                                     buffer.WriteDouble(p.direction);
  113.                                     buffer.WriteString(p.username);
  114.                                 }
  115.                             }
  116.                             sendAsyncEvent.SetBuffer(buffer.memory.ToArray(), 0, buffer.memory.ToArray().Length);
  117.                             player.socket.SendAsync(sendAsyncEvent);
  118.                             break;
  119.  
  120.                         case 1: //Disconnect
  121.                             Console.WriteLine("{0} disconnected", (player.socket.RemoteEndPoint as IPEndPoint).Address);
  122.                             buffer.WriteByte(5);
  123.                             buffer.WriteIn16(player.id);
  124.                             SendAll(buffer.memory.ToArray());
  125.                             IdMap[player.id] = -1;
  126.                             lock (players)
  127.                             {
  128.                                 player.socket.Dispose();
  129.                                 players.Remove(player);
  130.                             }
  131.                             disconnected = true;
  132.                             break;
  133.  
  134.                         case 2: //Получаем координаты от игрока
  135.                             int x = buff.ReadInt32();
  136.                             int y = buff.ReadInt32();
  137.                             double dir = buff.ReadDouble();
  138.                             player.x = x;
  139.                             player.y = y;
  140.                             player.direction = dir;
  141.                             buffer.WriteByte(6);
  142.                             buffer.WriteIn16(player.id);
  143.                             buffer.WriteInt32(x);
  144.                             buffer.WriteInt32(y);
  145.                             buffer.WriteDouble(dir);
  146.                             SendAll(buffer.memory.ToArray());
  147.                             break;
  148.                     }
  149.                 }
  150.                 while (buff.Tell() != e.BytesTransferred); //На всякий случай, если пакеты склеются
  151.                 if (count != 1)
  152.                     Console.WriteLine("sdjfk"); //Не обращай внимания, это просто для дебага
  153.                 Array.Clear(player.data, 0, player.data.Length); //Чистим байтовый массив у игрока
  154.                 if (!disconnected)
  155.                     AsyncReceive(player); //Если игрок не отключился, то идем заново принимать от него данные
  156.                 buffer.Clear();
  157.                 buff.Clear();
  158.                 e.Dispose(); //Для высвобождения памяти, асинхронность, сам понимаешь
  159.             }
  160.             catch (Exception ex)
  161.             {
  162.                 Console.WriteLine(ex);
  163.                 e.Dispose();
  164.             }
  165.         }
  166. //Отправляем всем данные
  167. private void SendAll(byte[] data)
  168.         {
  169.             try
  170.             {
  171.                 lock (players) //Нужно, потому что у меня в отдельном потоке стоит цикл, который проверяет внезапные дисконнекты у игроков
  172.                 {
  173.                     foreach (var p in players)
  174.                     {
  175.                         SocketAsyncEventArgs e = new SocketAsyncEventArgs();
  176.                         e.SetBuffer(data, 0, data.Length);
  177.                         e.Completed += SendAsyncCompleted;
  178.                         p.socket.SendAsync(e);
  179.                     }
  180.                 }
  181.             }
  182.             catch (Exception ex)
  183.             {
  184.                 Console.WriteLine(ex);
  185.             }
  186.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement