Ejemplo n.º 1
0
        private void ProcessInternally(AbstractServerHandler serverHandler)
        {
            TcpListener listener = null;

            try
            {
                _isConnected = true;
                var addresses = Dns.GetHostAddresses(_configuration.Host);
                listener = new TcpListener(addresses[0], _configuration.Port);
                listener.Start();
                while (_isConnected)
                {
                    var acceptedTcpClient = listener.AcceptTcpClient();
                    var thread            = new Thread(obj =>
                    {
                        AbstractClientHandler handler = null;
                        TcpClient client = null;
                        try
                        {
                            handler = serverHandler.CreateClientHandler();
                            handler.PreStart();
                            client     = (TcpClient)obj;
                            var stream = client.GetStream();
                            var reader = new StreamReader(stream);
                            var writer = new StreamWriter(stream);
                            while (_isConnected)
                            {
                                IMessage msgToSend;
                                while (handler.TryGetMessage(out msgToSend))
                                {
                                    writer.WriteLine(Serialize(msgToSend));
                                    writer.Flush();
                                }
                                writer.WriteLine(Serialize(SystemGetMessage.Instance));
                                writer.Flush();
                                var msg = Deserialize(reader.ReadLine());
                                handler.Handle(msg);
                            }
                        }
                        catch (Exception)
                        {
                            //Ignored. Just close close connection.
                        }
                        finally
                        {
                            client?.Close();
                            handler?.PostStop();
                        }
                    });
                    thread.Start(acceptedTcpClient);
                }
            }
            finally
            {
                listener?.Stop();
            }
        }
Ejemplo n.º 2
0
 public void Start(AbstractServerHandler handler, bool lockThread = true)
 {
     if (lockThread)
     {
         ProcessInternally(handler);
     }
     else
     {
         _thread = new Thread(obj => ProcessInternally((AbstractServerHandler)obj));
         _thread.Start(handler);
     }
 }