public ProxyMessageHandler(TcpClient client, INetworkHandler networkHandler) { _client = client; _endPoint = (IPEndPoint)client.Client.RemoteEndPoint; _networkHandler = networkHandler; Log.Debug("Connecting from proxy to local server handler"); Log.Debug("CONNECTED from proxy to local server handler"); var stream = _client.GetStream(); _writer = new BinaryWriter(new BufferedStream(stream, _client.SendBufferSize)); BinaryReader reader = new BinaryReader(stream); new Thread(() => { while (true) { if (_client == null) { return; } try { int packageNs = reader.ReadByte(); int len = reader.ReadInt32(); if (len == -1) { Close(); return; } byte[] bytes = reader.ReadBytes(len); if (bytes.Length > _client.ReceiveBufferSize) { Log.Warn($"Data of length {bytes.Length}bytes is bigger than TCP buffer {_client.ReceiveBufferSize}bytes"); } if (len == 0) { continue; } FastThreadPool.QueueUserWorkItem(() => { Package message = null; if (packageNs == 0) { message = PackageFactory.CreatePackage(bytes[0], bytes, "mcpe"); } else if (packageNs == 1) { message = PackageFactory.CreatePackage(bytes[0], bytes, "ftl"); } if (message == null) { Log.Error($"Bad parse of message"); } else { message.Timer.Restart(); if (Log.IsDebugEnabled) { Log.Debug($"Got message {message.GetType().Name}"); } _networkHandler.SendPackage(message); } }); } catch (Exception e) { Log.Error("Receive error", e); Close(); } } }) { IsBackground = true }.Start(); }