Files
PlantBox/PlantBox.Broker/TcpManager.cs

99 lines
2.9 KiB
C#

using PlantBox.Shared.Communication;
using PlantBox.Shared.Communication.Commands;
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace PlantBox.Broker
{
abstract class TcpManager
{
public Broker Broker { get; }
protected abstract string LogPrefix { get; }
protected abstract int ListeningPort { get; }
private TcpListener _listener;
public TcpManager(Broker broker)
{
Log("Initializing...");
Broker = broker;
_listener = new TcpListener(IPAddress.Any, ListeningPort);
}
public void Start()
{
Log("Starting...");
_listener.Start();
Log("Started");
TcpLoop();
}
private void TcpLoop()
{
while (Broker.IsRunning)
{
Log("Waiting client...");
var client = _listener.AcceptTcpClient();
Log($"Found client: {client.Client.RemoteEndPoint}");
ClientLoop(client);
}
}
private void ClientLoop(TcpClient client)
{
var commandStream = new CommandStream(client.GetStream());
try
{
while (client.Connected)
{
var packet = commandStream.Receive();
Log($"Received command from {client.Client.RemoteEndPoint}");
Log(packet.ToString());
switch (packet.Command)
{
case Command.Captors:
CaptorsCommand(commandStream, packet);
break;
case Command.Historic:
HistoricCommand(commandStream, packet);
break;
case Command.Info:
InfoCommand(commandStream, packet);
break;
case Command.Ping:
PingCommand(commandStream, packet);
break;
}
}
}
catch (Exception ex)
{
Log($"Client disconnected: {ex.Message}");
}
}
protected void Log(string message)
{
Console.WriteLine($"[{LogPrefix}]({DateTime.Now:HH:mm:ss}) {message}");
}
protected abstract void CaptorsCommand(CommandStream commandStream, CommandPacket packet);
protected abstract void HistoricCommand(CommandStream commandStream, CommandPacket packet);
protected abstract void InfoCommand(CommandStream commandStream, CommandPacket packet);
protected abstract void PingCommand(CommandStream commandStream, CommandPacket packet);
}
}