public static void ReadCallback(IAsyncResult asyncResult)
        {
            ClientState cs        = (ClientState)asyncResult.AsyncState;
            int         bytesRcvd = cs.NetStream.EndRead(asyncResult);

            cs.AddToTotalBytes(bytesRcvd);
            cs.AppendResponse(Encoding.ASCII.GetString(cs.ByteBuffer, 0, bytesRcvd));
            if (cs.TotalBytes < cs.ByteBuffer.Length)
            {
                Console.WriteLine("Thread {0} ({1}) - ReadCallback(): Received {2} bytes...",
                                  Thread.CurrentThread.GetHashCode(),
                                  Thread.CurrentThread.ThreadState, bytesRcvd);
                cs.NetStream.BeginRead(cs.ByteBuffer, cs.TotalBytes,
                                       cs.ByteBuffer.Length - cs.TotalBytes,
                                       new AsyncCallback(ReadCallback), cs.NetStream);
            }
            else
            {
                Console.WriteLine("Thread {0} ({1}) - ReadCallback(): Received {2} total " +
                                  "bytes: {3}", Thread.CurrentThread.GetHashCode(),
                                  Thread.CurrentThread.ThreadState, cs.TotalBytes, cs.EchoResponse);
                ReadDone.Set();     // 읽기 작업 종료 신호를 발생시킨다.
            }
        }