コード例 #1
0
        private void chk_Chat_Allow_CheckedChanged(object sender, EventArgs e)
        {
            String ServerMsg;

            if (chk_Chat_Allow.Checked)
            {
                ServerMsg = "" + (char)0x02 + Convert.ToChar("OPTION : 클라이언트간 채팅을 허가.".Length * 2) + (char)0x00 + "OPTION : 클라이언트간 채팅을 허가." + (char)0x03;
                txt_Chat_ChatBox.Invoke(new writeLog(writeChatLog), "OPTION : 클라이언트간 채팅을 허가.");
            }
            else
            {
                ServerMsg = "" + (char)0x02 + Convert.ToChar("OPTION : 클라이언트간 채팅을 금지.".Length * 2) + (char)0x00 + "OPTION : 클라이언트간 채팅을 금지." + (char)0x03;
                txt_Chat_ChatBox.Invoke(new writeLog(writeChatLog), "OPTION : 클라이언트간 채팅을 금지.");
            }
            byte[] Sending_Msg = Encoding.Unicode.GetBytes(ServerMsg); // 문자열을 아스키형 바이트로 형변환

            for (int index = 0; index < MaxConnectable; ++index)
            {
                try
                {
                    if (ClientGroup[index] != null)
                    {
                        if (CLB_ConnectedList.GetItemChecked(index) != false)
                        {
                            ClientGroup[index].Socket.GetStream().Write(Sending_Msg, 0, Sending_Msg.Length);
                        }
                    }
                }
                catch { }
            }
        }
コード例 #2
0
        private void msg_SendAll(String msg, String Nick)
        {
            NetworkStream NS;

            Rtxt_Chat_Log.Invoke(new writeLog(writeChatLog), (Nick + " : " + msg));

            msg = Nick + " : " + msg;
            msg = "" + (char)0x0002 + Convert.ToChar(msg.Length * 2) + (char)0x0000 + msg + (char)0x0003;


            byte[] Sending_Msg = Encoding.Unicode.GetBytes(msg); // 문자열을 아스키형 바이트로 형변환

            for (int index = 0; index < MaxConnectable; ++index)
            {
                if (ClientGroup[index] != null)
                {
                    if (ClientGroup[index].NickName == Nick)
                    {
                        continue;
                    }
                    try
                    {
                        if (ClientGroup[index] != null)
                        {
                            if (Nick == ServerNick && CLB_ConnectedList.GetItemChecked(index) != false)
                            {
                                NS = ClientGroup[index].Socket.GetStream();
                                Thread.Sleep(SleepTime);
                                NS.Write(Sending_Msg, 0, Sending_Msg.Length);
                            }
                            else if (chk_Chat_Allow.Checked && Nick != ServerNick)
                            {
                                NS = ClientGroup[index].Socket.GetStream();
                                Thread.Sleep(SleepTime);
                                NS.Write(Sending_Msg, 0, Sending_Msg.Length);
                            }
                        }
                    }
                    catch { }
                }
            }
        }
コード例 #3
0
        public void SortingClientSlot()
        {
            for (int cnt = 0; cnt < MaxConnectable; ++cnt)
            {
                try
                {
                    if (ClientGroup[cnt] != null)
                    {
                        if (ClientGroup[cnt].Socket.Connected == false)
                        {
                            Thread.Sleep(SleepTime * 2);
                            txt_Chat_ChatBox.Invoke(new writeLog(writeChatLog), (ClientGroup[cnt].NickName + "님이 접속을 종료하셨습니다."));
                            msg_SendAll(ClientGroup[cnt].NickName + "님께서 접속을 종료하셨습니다.", ServerNick);
                            CLB_ConnectedList.Invoke(new DeleteItems(DeleteCLBItem), cnt);

                            SortingClientInfo();
                            cnt = 0;
                            --ConnectedClientCount;
                        }
                    }
                }
                catch { }
            }
        }
コード例 #4
0
        private void ConnListenFunc()
        {
            try
            {
                tcpListener = new TcpListener(IPAddress.Any, Convert.ToInt32(txt_Server_Port.Text));    // 포트를 점유 - TCP리스너는 하나로
                tcpListener.Start();
                isRunning = true;

                ClientGroup = new ClientInfo[MaxConnectable];

                RecvThread = new Thread(new ThreadStart(recvFunc));
                RecvThread.SetApartmentState(System.Threading.ApartmentState.STA);
                RecvThread.Start();

                CheckConnThread = new Thread(new ThreadStart(ClientStatusReviewFunc));
                CheckConnThread.Start();

                txt_Chat_ChatBox.Invoke(new writeLog(writeChatLog), "서버는 현재 온라인 상태.");
            }
            catch { MessageBox.Show("서버를 시작할 수 없습니다.", "오류", MessageBoxButtons.OK, MessageBoxIcon.Warning); }

            TcpClient client;

            ConnectedClientCount = 0;
            int X = 0;

            while (isRunning)
            {
                try
                {
                    client = tcpListener.AcceptTcpClient();

                    if (client.Connected == true)
                    {
                        if (ConnectedClientCount < MaxConnectable)
                        {
                            Thread.Sleep(SleepTime);
                            ClientInfo tmpClientInfo = new ClientInfo();

                            tmpClientInfo.Socket   = client;
                            tmpClientInfo.NickName = "Client_" + X++.ToString();
                            txt_Chat_ChatBox.Invoke(new writeLog(writeChatLog), (tmpClientInfo.NickName + " 님이 연결됨"));
                            msg_SendAll(tmpClientInfo.NickName + " 님께서 입장하셨습니다.", ServerNick);
                            ++ConnectedClientCount;

                            CLB_ConnectedList.Invoke(new AdditemConnList(AddConnList), tmpClientInfo);


                            msg_SendTarget("SHM 채팅 서버에 오신것을 환영합니다.", ServerNick, tmpClientInfo.NickName, false);
                            msg_SendTarget("먼저, 시스템 명령어로 닉네임을 설정해주십시오.", ServerNick, tmpClientInfo.NickName, false);
                            msg_SendTarget("처음 접속하시는 분께서는 /? 를 입력하여 도움말을 한번씩 읽어주시기 바랍니다.", ServerNick, tmpClientInfo.NickName, false);



                            tmpClientInfo = null;
                        }
                        else
                        {
                            String msg = "Server : 정원이 초과되어 접속요청을 거부합니다.";
                            msg = "" + (char)0x0002 + Convert.ToChar(msg.Length * 2) + (char)0x0000 + msg + (char)0x0003;

                            byte[] Sending_Msg = Encoding.Unicode.GetBytes(msg); // 문자열을 아스키형 바이트로 형변환

                            client.GetStream().Write(Sending_Msg, 0, Sending_Msg.Length);
                            client.Close();
                        }
                    }
                }
                catch { }
            }
        }
コード例 #5
0
        private void SystemMessageProcess(String msg, String Nick)
        {
            String SendSysMsg = "";
            bool   Correct    = true;

            #region 귓속말
            if (msg.StartsWith("/w ") || msg.StartsWith("/ㅈ ") || msg.StartsWith("/W "))
            {
                String Target = "";
                int    cnt;

                for (cnt = 3; msg[cnt] != ' '; ++cnt)
                {
                    Target += msg[cnt];
                }

                for (++cnt; cnt < msg.Length; ++cnt)
                {
                    SendSysMsg += msg[cnt];
                }

                if (msg_SendTarget(SendSysMsg, Nick, Target, false))
                {
                    msg_SendTarget(SendSysMsg, Target, Nick, true);
                }
                else
                {
                    msg_SendTarget("대상이 존재하지 않습니다.", ServerNick, Nick, false);
                }
            }
            #endregion
            #region 닉네임 설정
            else if (msg.StartsWith("/nick ") || msg.StartsWith("/닉 "))
            {
                String tmpNick = "";
                int    cnt;

                for (cnt = 0; msg[cnt] != ' '; ++cnt)
                {
                    ;
                }

                for (++cnt; cnt < msg.Length; ++cnt)
                {
                    if (msg[cnt] != ' ')
                    {
                        tmpNick += msg[cnt];
                    }
                    else
                    {
                        msg_SendTarget("이름에 공백이 있으므로 변경이 거부되었습니다.", ServerNick, Nick, false);
                        Correct = false;
                        break;
                    }
                }


                if (tmpNick == ServerNick)
                {
                    msg_SendTarget("서버닉은 사용하실수 없습니다 !", ServerNick, Nick, false);
                    Correct = false;
                }
                else
                {
                    for (cnt = 0; cnt < MaxConnectable; ++cnt)
                    {
                        if (ClientGroup[cnt] != null)
                        {
                            if (tmpNick == ClientGroup[cnt].NickName)
                            {
                                msg_SendTarget("이미 사용중인 닉네임이어서 요청이 거부되었습니다.", ServerNick, Nick, false);
                                Correct = false;
                            }
                        }
                    }
                }

                if (Correct)
                {
                    for (cnt = 0; cnt < MaxConnectable; ++cnt)
                    {
                        if (ClientGroup[cnt] != null)
                        {
                            if (Nick == ClientGroup[cnt].NickName)
                            {
                                msg_SendTarget("당신의 닉네임은 " + tmpNick + "으로 변경되었습니다.", ServerNick, Nick, false);
                                msg_NoticeAll(Nick + "님의 닉네임이 " + tmpNick + "(으)로 변경되었습니다.", Nick);
                                ClientGroup[cnt].NickName = tmpNick;
                                CLB_ConnectedList.Invoke(new ReplaceItem(ReplaceCLBItem), cnt, tmpNick);
                            }
                        }
                    }
                }
            }
            #endregion
            #region 접속자 명단 확인
            else if (msg.Equals("/list") || msg.Equals("/접속자"))
            {
                for (int cnt = 0; cnt < MaxConnectable; ++cnt)
                {
                    if (ClientGroup[cnt] != null)
                    {
                        if (ClientGroup[cnt].NickName == Nick)
                        {
                            msg_SendTarget("[" + ClientGroup[cnt].NickName + "] - " + cnt + "번 슬롯 (당신)", ServerNick, Nick, false);
                        }
                        else
                        {
                            msg_SendTarget("[" + ClientGroup[cnt].NickName + "] - " + cnt + "번 슬롯", ServerNick, Nick, false);
                        }
                    }
                }
            }
            #endregion
            #region 현재 대화명 확인
            else if (msg.Equals("/who") || msg.Equals("/누구"))
            {
                msg_SendTarget("당신의 현재 대화명은 [" + Nick + "] 입니다.", ServerNick, Nick, false);
            }
            #endregion

            #region 도움말
            else if (msg.Equals("/?") || msg.Equals("/help") || msg.Equals("/도움말"))
            {
                msg_SendTarget("귓속말 = /w 혹은 /W 혹은 /ㅈ", ServerNick, Nick, false);
                msg_SendTarget("예시)) /w [id] [msg] -> [id]에게 귓속말", ServerNick, Nick, false);

                msg_SendTarget("", ServerNick, Nick, false);

                msg_SendTarget("도움말 호출 = /? 혹은 /help 혹은 /도움말", ServerNick, Nick, false);
                msg_SendTarget("예시)) /?", ServerNick, Nick, false);

                msg_SendTarget("", ServerNick, Nick, false);

                msg_SendTarget("대화명 설정 = /nick 혹은 /닉", ServerNick, Nick, false);
                msg_SendTarget("예시)) /nick [ID]", ServerNick, Nick, false);

                msg_SendTarget("", ServerNick, Nick, false);

                msg_SendTarget("대화명 확인 = /who 혹은 /누구", ServerNick, Nick, false);
                msg_SendTarget("예시)) /who", ServerNick, Nick, false);

                msg_SendTarget("", ServerNick, Nick, false);

                msg_SendTarget("접속자 확인 = /list 혹은 /접속자", ServerNick, Nick, false);
                msg_SendTarget("예시)) /list", ServerNick, Nick, false);
            }
            #region 잘못된 명령일경우의 처리
            else
            {
                msg_SendTarget("잘못된 시스템 명령어입니다. /?를 입력하여 도움말을 읽어주십시오.", ServerNick, Nick, false);
            }
            #endregion
        }