/// /// Класс сессии подключенной к серверу /// Сама сессия умеет только получать сообщения от клиента, передавать их обработчику и затем посылать ответ /// /// internal class TcpSession 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; }