public void recvFunc()
        {
            Thread.Sleep(1); // 알지 못하는 버그 때문에 임시로 세워두었음. 세워두지 않으면 디버그 모드를 제외한 실행에서 쓰레드가 실행되지 않는다.
            byte[] buffer;
            string recvMsg;

            NS = TargetServer.GetStream();

            while (isRunning)
            {
                try
                {
                    buffer = new byte[1024]; // 바이트방식으로 데이터를 가져옴
                    NS.Read(buffer, 0, buffer.Length);

                    /* 해석부 */
                    ////////////////////////////////////////////////////////////////////////////////
                    int    cnt        = 0;
                    int    dataLength = 0;
                    byte[] dataBuffer;



                    while (cnt < buffer.Length)
                    {
                        if (buffer[cnt] == (byte)0x0002)  // 시작을 알리는 문자가 들어올 경우, 본격적인 실행
                        {
                            ++cnt;
                            dataLength = (int)buffer[++cnt] + (int)buffer[++cnt];
                            cnt       += 3; // 수신부분에서는 대상을 판단할 필요가 없다.

                            dataBuffer = new byte[dataLength];

                            for (int cntX = 0; cntX < dataLength && cnt < buffer.Length; ++cntX, ++cnt)
                            {
                                dataBuffer[cntX] = buffer[cnt];
                            }
                            if (cnt < buffer.Length)
                            {
                                if (buffer[cnt] == (byte)0x03) // 끝을 알리는 문자가 확인되면 메세지를 출력한다.
                                {
                                    // 인코딩 ---- 데이터만 인코딩 하게 해야한다 ( 다른방법을 안다면 더 좋겠지만.. )
                                    recvMsg = Encoding.Unicode.GetString(dataBuffer);
                                    Rtxtb_Chat_Log.Invoke(new WriteChatLog(WriteLog), recvMsg);
                                }
                            }
                        }
                        ++cnt;
                    }

                    ////////////////////////////////////////////////////////////////////////////////


                    buffer     = null;
                    dataBuffer = null;
                    System.GC.Collect();
                }
                catch {} // 캐치의 경우는 필요 없다
            }
        }
        private void send()
        {
            try
            {
                string msg = txtb_Chat_Box.Text;
                txtb_Chat_Box.Text = "";

                if (!msg.StartsWith("/"))
                {
                    Rtxtb_Chat_Log.Invoke(new WriteChatLog(WriteLog), (("나 : ") + msg));
                }

                /*    시작플래그        길이                               대상      Data   종료플래그                */
                msg = "" + (char)0x0002 + Convert.ToChar(msg.Length * 2) + (char)0x0000 + msg + (char)0x0003;
                byte[] Sending_Msg = Encoding.Unicode.GetBytes(msg);


                // 네트워크 스트림을 통해 메세지 바이트(Sending_Msg)를 처음부터 길이 끝까지 전송한다.
                TargetServer.GetStream().Write(Sending_Msg, 0, Sending_Msg.Length);

                // msg =  ("나 : ") + msg;
            }
            catch
            {
                MessageBox.Show("정상적으로 메세지의 전송이 이루어지지 않았습니다.", "전송 오류", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
        private void DisConnect()
        {
            if (NS != null)
            {
                NS.Close();
            }
            if (TargetServer != null)
            {
                TargetServer.Close();
            }

            if (recvThread != null)
            {
                recvThread.Abort();
            }
            if (ConnStatusFindThread != null)
            {
                ConnStatusFindThread.Abort();
            }

            Pic_StatusIcon.Image = SimpleChatClient.Properties.Resources.redbutton_hi;

            isRunning                 = false;
            btn_Connect.Enabled       = true;
            btn_DisConnect.Enabled    = false;
            btn_Send_Msg.Enabled      = false;
            txtb_Server_IP.ReadOnly   = false;
            txtb_Server_Port.ReadOnly = false;
            txtb_Chat_Box.Enabled     = false;
            btn_Send_Msg.Enabled      = false;

            Rtxtb_Chat_Log.Invoke(new WriteChatLog(WriteLog), "서버와의 연결이 해제되었습니다.");
        }
        delegate void WriteChatLog(String msg); // 타 쓰로드에서 접근이 가능하게 해야하므로..

        public void WriteLog(String msg)
        {
            LogWriter = new StreamWriter(LogPath, true);
            Rtxtb_Chat_Log.AppendText("\n");
            Rtxtb_Chat_Log.AppendText("[" + String.Format("{0:00}", DateTime.Now.Hour) + ":" + String.Format("{0:00}", DateTime.Now.Minute) + "] " + msg);

            Rtxtb_Chat_Log.ScrollToCaret();
            LogWriter.WriteLine("[" + DateTime.Now + "] " + msg);
            LogWriter.Flush();
            LogWriter.Close();
        }
 private void 채팅창비우기ToolStripMenuItem_Click(object sender, EventArgs e)
 {
     Rtxtb_Chat_Log.Clear();
 }
        private bool Connect()
        {
            Pic_StatusIcon.Image = SimpleChatClient.Properties.Resources.yellow_button_clip_md;

            if (txtb_Server_IP.Text != "")
            {
                if (txtb_Server_Port.Text != "")
                {
                    try
                    {
                        int TargetPort = Convert.ToInt16(this.txtb_Server_Port.Text);

                        TargetServer = new TcpClient(this.txtb_Server_IP.Text, TargetPort); //

                        // recvThread는 함수 RecvThread를 갖는 새로운 쓰레드로서 생성한뒤 실행한다.
                        recvThread = new Thread(new ThreadStart(recvFunc));
                        recvThread.Start();

                        ConnStatusFindThread = new Thread(new ThreadStart(ConnStatusFind_Func));
                        ConnStatusFindThread.Start();

                        this.isRunning              = true;
                        this.btn_Connect.Enabled    = false;
                        this.btn_DisConnect.Enabled = true;
                        this.btn_Send_Msg.Enabled   = true;
                        txtb_Server_IP.ReadOnly     = true;
                        txtb_Server_Port.ReadOnly   = true;
                        txtb_Chat_Box.Enabled       = true;
                        btn_Send_Msg.Enabled        = true;

                        txtb_Chat_Box.Focus();

                        Pic_StatusIcon.Image = SimpleChatClient.Properties.Resources.greenbutton_hi;

                        txtb_Chat_Box.Clear();
                        Rtxtb_Chat_Log.Clear();

                        Rtxtb_Chat_Log.Invoke(new WriteChatLog(WriteLog), "서버와 연결되었습니다.");

                        return(true);
                    }
                    catch
                    {
                        MessageBox.Show("서버에 연결할 수 없습니다.", "접속 오류", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        txtb_Server_IP.Focus();
                        Pic_StatusIcon.Image = SimpleChatClient.Properties.Resources.redbutton_hi;
                        return(false);
                    }
                }
                else
                {
                    MessageBox.Show("포트 번호를 입력해주십시오.", "입력 오류", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    txtb_Server_Port.Focus();
                    Pic_StatusIcon.Image = SimpleChatClient.Properties.Resources.redbutton_hi;
                    return(false);
                }
            }
            else
            {
                MessageBox.Show("서버의 IP주소를 입력해주십시오.", "입력 오류", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtb_Server_IP.Focus();
                Pic_StatusIcon.Image = SimpleChatClient.Properties.Resources.redbutton_hi;
                return(false);
            }
        }