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 { } } }
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 { } } } }
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 { } } }
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 { } } }
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 }