public void Connect(string hostname = "localhost", int port = 5858)
        {
            this.Dispose();

            this.messages = new Queue<string>();
            this.connection = new TcpClient(hostname, port);
            this.stream = this.connection.GetStream();

            this.readLoop = new Thread(() =>
            {
                byte[] packetBody;
                byte[] packetEndMarker = this.EncodePacket("\r\n\r\n");
                Regex packetHeaderPattern = new Regex(@"^Content-Length: (\d+)" + Encoding.Default.GetString(packetEndMarker) + "$");

                int contentLength;
                string message;

                string header = this.DecodePacket(this.stream.ReadToMarker(packetEndMarker));

                while (true)
                {
                    if (!this.stream.DataAvailable)
                    {
                        Thread.Sleep(0);
                        continue;
                    }

                    header = this.DecodePacket(this.stream.ReadToMarker(packetEndMarker));
                    contentLength = int.Parse(packetHeaderPattern.Match(header).Groups[1].Value);
                    packetBody = stream.ReadBytes(contentLength);
                    message = this.DecodePacket(packetBody);   
 
                    this.messages.Enqueue(message);
                }
            });

            this.readLoop.Start();
        }