/// <summary>
/// Класс сессии подключенной к серверу
/// Сама сессия умеет только получать сообщения от клиента, передавать их обработчику и затем посылать ответ
///
/// </summary>
internal class TcpSession<T> where T : TcpSessionHandler
{
#region Private vars
private Socket _sessionSocket = null;
private Guid _sessionID = new Guid();
private bool _isStoped = false;
private Task _sessionCommunicationTask = null;
private CancellationToken _cancellationToken;
#endregion Private vars
#region Props
public Guid ID => _sessionID;
public bool IsStoped => _isStoped;
#endregion Props
#region ctor
public TcpSession(Socket clientSocket)
{
this._sessionSocket = clientSocket;
_sessionID = Guid.NewGuid();
}
#endregion ctor
#region Public
internal void StartSession(CancellationToken cancellationToken)
{
_cancellationToken = cancellationToken;
if(_sessionSocket != null)
{
_isStoped = false;
_sessionCommunicationTask = new Task(SessionCommunicationTask, _cancellationToken);
_sessionCommunicationTask.Start();
}
}
private void SessionCommunicationTask()
{
while(!(IsStoped || _cancellationToken.IsCancellationRequested))
{
try
{
byte[] buffer = new byte[1024];
int dataSize = _sessionSocket.ReceiveAsync(buffer, SocketFlags.None).Result;
}
catch(SocketException ex)
{
StopSession();
}
Thread.Sleep(100);
}
}
internal void StopSession()
{
_isStoped = true;
}