Advertisement
KpoKec

Untitled

Apr 18th, 2019
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.02 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Net.Sockets;
  4. using DataTypes;
  5.  
  6. namespace Managers {
  7.     public class NetworkManager {
  8.         private TcpClient            client;
  9.         private Socket               socket;
  10.         private NetworkStream        stream;
  11.         private string               serverAddress;
  12.         private int                  serverPort;
  13.         private byte[]               buffer = new byte[PacketData._packetLength * 100];
  14.         private Action<PacketData[]> onReceive;                           // колбэк для события приёма пакета
  15.         private Queue<PacketData>    queueSend = new Queue<PacketData>(); // очередь пакетов на отправку
  16.         private bool                 isBusy;                              // флаг занятости отправки
  17.  
  18.         public void SendPackets(PacketData[] data) {
  19.             foreach (var packetData in data)
  20.                 queueSend.Enqueue(packetData);
  21.             if (!isBusy)
  22.                 Send();
  23.         }
  24.  
  25.         private void Send() {
  26.             if (queueSend.Count == 0) { // если очередб пустая
  27.                 isBusy = false; // ставим флаг
  28.                 return;
  29.             }
  30.  
  31.             isBusy = true; // ставим флаг
  32.             var b = queueSend.Dequeue().ToArray(); // берем из очереди пакет
  33.             stream.BeginWrite(b, 0, b.Length, OnSend, stream); // асинхронно отправляем
  34.         }
  35.  
  36.         private void OnSend(IAsyncResult ar) { // по окончании передачи
  37.             Send(); // вызываем отправку опять
  38.         }
  39.  
  40.         public NetworkManager(string serverAddress, int serverPort, Action<PacketData[]> onReceive) {
  41.             this.serverAddress = serverAddress;
  42.             this.serverPort    = serverPort;
  43.             this.onReceive     = onReceive;
  44.             client             = new TcpClient();
  45.             client.BeginConnect(serverAddress, serverPort, OnConnect, client); // асинхронный коннект
  46.         }
  47.  
  48.         private void OnConnect(IAsyncResult ar) {
  49.             socket = client.Client; // кешируем сокет
  50.             stream = client.GetStream(); // кешируем поток
  51.             BeginReceive(); // начинаем приём
  52.             SendPackets(PacketData.Handshake(0x10a));
  53.         }
  54.  
  55.         private void BeginReceive() {
  56.             stream.BeginRead(buffer, 0, buffer.Length, OnReceive, stream); // запускаем асинхронный приём
  57.         }
  58.  
  59.         private void OnReceive(IAsyncResult ar) {
  60.             var total   = stream.EndRead(ar); // сколько приняли байт
  61.             var packets = PacketData.SplitToPackets(PacketData.ExtractSubarray(buffer, 0, total)); // бьём ПРИНЯТЫЕ байты по пакетам
  62.             onReceive(packets); // вызываем колбэк для их обработки
  63.         }
  64.     }
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement