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); } }