Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Net.Sockets;
- using DataTypes;
- namespace Managers {
- public class NetworkManager {
- private TcpClient client;
- private Socket socket;
- private NetworkStream stream;
- private string serverAddress;
- private int serverPort;
- private byte[] buffer = new byte[PacketData._packetLength * 100];
- private Action<PacketData[]> onReceive; // колбэк для события приёма пакета
- private Queue<PacketData> queueSend = new Queue<PacketData>(); // очередь пакетов на отправку
- private bool isBusy; // флаг занятости отправки
- public void SendPackets(PacketData[] data) {
- foreach (var packetData in data)
- queueSend.Enqueue(packetData);
- if (!isBusy)
- Send();
- }
- private void Send() {
- if (queueSend.Count == 0) { // если очередб пустая
- isBusy = false; // ставим флаг
- return;
- }
- isBusy = true; // ставим флаг
- var b = queueSend.Dequeue().ToArray(); // берем из очереди пакет
- stream.BeginWrite(b, 0, b.Length, OnSend, stream); // асинхронно отправляем
- }
- private void OnSend(IAsyncResult ar) { // по окончании передачи
- Send(); // вызываем отправку опять
- }
- public NetworkManager(string serverAddress, int serverPort, Action<PacketData[]> onReceive) {
- this.serverAddress = serverAddress;
- this.serverPort = serverPort;
- this.onReceive = onReceive;
- client = new TcpClient();
- client.BeginConnect(serverAddress, serverPort, OnConnect, client); // асинхронный коннект
- }
- private void OnConnect(IAsyncResult ar) {
- socket = client.Client; // кешируем сокет
- stream = client.GetStream(); // кешируем поток
- BeginReceive(); // начинаем приём
- SendPackets(PacketData.Handshake(0x10a));
- }
- private void BeginReceive() {
- stream.BeginRead(buffer, 0, buffer.Length, OnReceive, stream); // запускаем асинхронный приём
- }
- private void OnReceive(IAsyncResult ar) {
- var total = stream.EndRead(ar); // сколько приняли байт
- var packets = PacketData.SplitToPackets(PacketData.ExtractSubarray(buffer, 0, total)); // бьём ПРИНЯТЫЕ байты по пакетам
- onReceive(packets); // вызываем колбэк для их обработки
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement