Esempio n. 1
0
        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();
                }
            }
        }
Esempio n. 2
0
        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);
        }