void Send() { if (is_server) // 함수를 호출한 프로세스가 서버일 경우 { // 서버가 대기 중인지 확인한다. if (!server_socket.IsBound) { MsgBoxHelper.Warn("서버가 실행되고 있지 않습니다!"); return; } // 보낼 텍스트 지정 string tts = txt_send.Text.Trim(); // 텍스트박스 예외처리 //if(string.IsNullOrEmpty(tts)) { // //MsgBoxHelper.Warn("텍스트가 입력되지 않았습니다!"); // txt_send.Focus(); // return; //} // 보낼 텍스트가 비어 있지 않다면 if (!string.IsNullOrEmpty(tts)) { // 서버의 닉네임과 메세지 및 플레이어 번호(1)를 전송한다. // 문자열을 utf8 형식의 바이트로 변환한다. ('\x01'은 구분자.) byte[] bDts = Encoding.UTF8.GetBytes(server_nickname + '\x01' + tts + '\x01' + "1"); // 연결된 모든 클라이언트에게 전송한다. foreach (string nickname in connected_clients.Keys) { Socket socket = connected_clients[nickname]; try { socket.Send(bDts); } catch { // 오류 발생하면 전송 취소하고 리스트에서 삭제한다. try { socket.Dispose(); } catch { } connected_clients.Remove(nickname); } } // 전송 완료 후 텍스트 박스에 추가하고, 원래의 내용은 지운다. AppendText(rtb_chat, string.Format("(1P){0}: {1}", server_nickname.ToString(), tts)); txt_send.Clear(); // 커서를 텍스트박스로 txt_send.Focus(); } } else // 함수를 호출한 프로세스가 클라이언트이면 { // 서버가 대기 중인지 확인한다. if (!client_socket.IsBound) { MsgBoxHelper.Warn("서버가 실행되고 있지 않습니다!"); return; } // 보낼 텍스트 지정 string tts = txt_send.Text.Trim(); // 텍스트박스가 비어 있는 경우 //if(string.IsNullOrEmpty(tts)) { // //MsgBoxHelper.Warn("텍스트가 입력되지 않았습니다!"); // txt_send.Focus(); // return; //} // 보낼 텍스트가 비어 있지 않으면 if (!string.IsNullOrEmpty(tts)) { // 클라이언트의 닉네임과 메세지를 전송한다. // 문자열을 utf8 형식의 바이트로 변환한다. ('\x01'은 구분자) byte[] bDts = Encoding.UTF8.GetBytes(my_nickname + '\x01' + tts + '\x01' + my_player_num.ToString()); // 서버에 전송한다. client_socket.Send(bDts); // 전송 완료 후 텍스트 박스에 추가하고, 원래의 내용은 지운다. AppendText(rtb_chat, string.Format("({0}P){1}: {2}", my_player_num, my_nickname, tts)); txt_send.Clear(); // 커서를 텍스트박스로 txt_send.Focus(); } } }
private void btn_Client_Click(object sender, EventArgs e) { if (client_socket.Connected) { MsgBoxHelper.Error("이미 연결되어 있습니다!"); return; } int port; if (!int.TryParse(txt_port.Text, out port)) { lbl_loginAlert.ForeColor = Color.Red; lbl_loginAlert.Text = "잘못된 포트번호입니다."; txt_port.Focus(); txt_port.SelectAll(); return; } if (txt_nickname.Text == "") { lbl_loginAlert.ForeColor = Color.Red; lbl_loginAlert.Text = "잘못된 닉네임입니다."; txt_nickname.Focus(); txt_nickname.SelectAll(); return; } changePhase(PHASE.CONNECTING); try { client_socket.Connect(txt_ip.Text, port); } catch (Exception ex) { lbl_loginAlert.ForeColor = Color.Red; lbl_loginAlert.Text = "연결에 실패했습니다!"; changePhase(PHASE.LOGIN); return; } // 연결 완료되었다는 메세지를 띄워준다. //AppendText(rtb_chat, "서버와 연결되었습니다."); // 클라이언트 자신의 닉네임을 설정한다. my_nickname = txt_nickname.Text; // 서버에게 닉네임을 보낸다. SendNickname(); // 서버에게서 플레이어 번호를 할당받는다. GetPlayerNum(); //게임인터페이스로 이동 changePhase(PHASE.LOBBY); // 로비로 이동.(준비 전 상태) // 채팅창을 사용 가능하도록 변경 txt_send.Enabled = true; btn_send.Enabled = true; btn_ready.Enabled = true; // 연결 완료, 서버에서 데이터가 올 수 있으므로 수신 대기한다. AsyncObject obj = new AsyncObject(4096); // 데이터 송신을 대기할 소켓 지정 obj.WorkingSocket = client_socket; // 해당 소켓이 비동기로 데이터를 받는 함수 BeginReceive 호출 client_socket.BeginReceive(obj.Buffer, 0, obj.BufferSize, 0, DataReceived, obj); }