178 lines
5.2 KiB
C#
178 lines
5.2 KiB
C#
using Articulate_Network.Events;
|
|
using Articulate_Network.Interfaces;
|
|
using Articulate_Network.Managers;
|
|
using Articulate_Network.Packets;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Net.Sockets;
|
|
using System.Reflection;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Articulate_Network
|
|
{
|
|
public class Server
|
|
{
|
|
List<IManager> managers = new List<IManager>();
|
|
TcpClient[] clients = new TcpClient[300];
|
|
|
|
TcpListener tcpListener;
|
|
|
|
public Server()
|
|
{
|
|
InitializeManagers();
|
|
}
|
|
|
|
public async Task<bool> Start(string ip, int port)
|
|
{
|
|
tcpListener = new TcpListener(IPAddress.Parse(ip), port);
|
|
|
|
bool connected = await Task.Run(async () =>
|
|
{
|
|
try
|
|
{
|
|
tcpListener.Start();
|
|
|
|
_ = HandleConnections();
|
|
|
|
return true;
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Console.WriteLine(e.Message);
|
|
return false;
|
|
}
|
|
}
|
|
);
|
|
|
|
return false;
|
|
}
|
|
|
|
public async Task HandleConnections()
|
|
{
|
|
while (true)
|
|
{
|
|
var client = await tcpListener.AcceptTcpClientAsync();
|
|
|
|
for (int i = 0; i < clients.Length; i++)
|
|
if (clients[i] == null)
|
|
{
|
|
clients[i] = client;
|
|
Console.WriteLine($"Client {i+1} connected from {(client.Client.RemoteEndPoint as IPEndPoint).Address}.");
|
|
break;
|
|
}
|
|
|
|
_ = ReceiveData(client);
|
|
|
|
OnClientConnected(new ClientConnectedEventArgs() { TcpClient = client });
|
|
}
|
|
}
|
|
|
|
public async Task<bool> ReceiveData(TcpClient client)
|
|
{
|
|
await Task.Run(() =>
|
|
{
|
|
byte[] buffer = new byte[8192];
|
|
var ms = new MemoryStream(buffer);
|
|
var br = new BinaryReader(ms);
|
|
|
|
while (client.Connected)
|
|
{
|
|
try
|
|
{
|
|
int bytesToRead = client.Client.Receive(buffer, buffer.Length, SocketFlags.None);
|
|
|
|
ms.Position = 0;
|
|
|
|
while (ms.Position < bytesToRead)
|
|
{
|
|
int length = (int)br.ReadInt64();
|
|
|
|
OnDataReceived(new Articulate_Network.Events.DataReceivedEventArgs()
|
|
{
|
|
Packet = Get<PacketManager>().DeserializePacket(ms),
|
|
Client = client
|
|
});
|
|
|
|
int end = (int)br.ReadInt64();
|
|
}
|
|
}
|
|
catch (SocketException e)
|
|
{
|
|
for (int i = 0; i < clients.Length; i++)
|
|
if (clients[i] == client)
|
|
{
|
|
clients[i] = null;
|
|
Console.WriteLine($"Client {i+1} lost connection.");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
return false;
|
|
}
|
|
|
|
public async Task<bool> SendPacket(TcpClient tcpClient, Packet packet)
|
|
{
|
|
await Task.Run(() =>
|
|
{
|
|
byte[] buffer = Get<PacketManager>().SerializePacket(packet);
|
|
|
|
tcpClient.Client.Send(buffer, buffer.Length, SocketFlags.None);
|
|
});
|
|
|
|
return false;
|
|
}
|
|
|
|
public void InitializeManagers()
|
|
{
|
|
var @interface = typeof(IManager);
|
|
|
|
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
|
|
{
|
|
var managersFound = assembly.GetTypes().Where(t => @interface.IsAssignableFrom(t) && !t.IsAbstract);
|
|
|
|
foreach (var m in managersFound)
|
|
{
|
|
var manager = (IManager)Activator.CreateInstance(m);
|
|
|
|
manager.Initialize();
|
|
|
|
managers.Add(manager);
|
|
}
|
|
}
|
|
|
|
Console.WriteLine($"Initialized {managers.Count} manager{(managers.Count > 1 ? "s" : "")}");
|
|
}
|
|
|
|
public T Get<T>()
|
|
{
|
|
return (T)managers.SingleOrDefault(t => typeof(T) == t.GetType());
|
|
}
|
|
|
|
protected virtual void OnClientConnected(ClientConnectedEventArgs e)
|
|
{
|
|
EventHandler<ClientConnectedEventArgs> handler = ClientConnected;
|
|
|
|
if (handler != null)
|
|
handler(this, e);
|
|
}
|
|
|
|
public event EventHandler<ClientConnectedEventArgs> ClientConnected;
|
|
|
|
protected virtual void OnDataReceived(Articulate_Network.Events.DataReceivedEventArgs e)
|
|
{
|
|
EventHandler<Articulate_Network.Events.DataReceivedEventArgs> handler = DataReceived;
|
|
|
|
if (handler != null)
|
|
handler(this, e);
|
|
}
|
|
|
|
public event EventHandler<Articulate_Network.Events.DataReceivedEventArgs> DataReceived;
|
|
}
|
|
}
|