/// <summary> /// 유저 접속 이벤트 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void insUser_OnConnected(claUser sender) { //유저 추가는 'Accept_Completed'에서 하므로 //여기서 하는 것은 무결성 검사가 끝난 유저를 처리 해주는 것이다. StringBuilder sbMsg = new StringBuilder();; //로그인이 완료된 유저에게 유저 리스트를 보낸다. Commd_User_List_Get(sender); //전체 유저에게 접속자를 알린다. sbMsg.Clear(); sbMsg.Append(claCommand.Command.User_Connect.GetHashCode()); sbMsg.Append(claGlobal.g_Division); sbMsg.Append(sender.UserID); //전체 유저에게 메시지 전송(지금 로그인 한 접속자는 제외) AllUser_Send(sbMsg.ToString(), sender); //로그 유저 리스트에 추가 this.Invoke(new Action( delegate() { listUser.Items.Add(sender.UserID); })); //로그 남기기 sbMsg.Clear(); sbMsg.Append("*** 접속자 : "); sbMsg.Append(sender.UserID); sbMsg.Append(" ***"); DisplayLog(sbMsg.ToString()); }
/// <summary> /// 전체 유저중 지정한 유저를 제외하고 메시지를 전송 합니다. /// </summary> /// <param name="sMsg"></param> /// <param name="insUser">제외할 유저</param> private void AllUser_Send(string sMsg, claUser insUser) { //모든 유저에게 메시지를 전송 한다. foreach (claUser insUser_Temp in m_listUser) { //제외 유저 if (insUser_Temp.UserID != insUser.UserID) { //제외 유저가 아니라면 메시지를 보낸다. insUser_Temp.SendMsg_User(sMsg); } } //로그 출력 DisplayLog(sMsg); }
/// <summary> /// 명령 처리 - ID체크 /// </summary> /// <param name="sID"></param> private void Commd_IDCheck(claUser insUser, string sID) { //사용 가능 여부 bool bReturn = true; //모든 유저의 아이디 체크 foreach (claUser insUserTemp in m_listUser) { if (insUserTemp.UserID == sID) { //같은 유저가 있다! //같은 유저가 있으면 그만 검사한다. bReturn = false; break; } } if (true == bReturn) { //사용 가능 //아이디를 지정하고 insUser.UserID = sID; //유저에게 로그인이 성공했음을 알림 StringBuilder sbMsg = new StringBuilder(); //접속자에게 먼저 로그인이 성공했음을 알린다. sbMsg.Append(claCommand.Command.ID_Check_Ok.GetHashCode()); sbMsg.Append(claGlobal.g_Division); insUser.SendMsg_User(sbMsg.ToString()); //유저가 접속 했음을 직접 알리지 말고 'ID_Check_Ok'를 받은 //클라이언트가 직접 요청한다. } else { //검사 실패를 알린다. StringBuilder sbMsg = new StringBuilder(); sbMsg.Append(claCommand.Command.ID_Check_Fail.GetHashCode().ToString()); sbMsg.Append(claGlobal.g_Division); insUser.SendMsg_User(sbMsg.ToString()); } }
/// <summary> /// 명령 처리 - 유저 리스트 갱신 요청 /// </summary> /// <param name="insUser"></param> private void Commd_User_List_Get(claUser insUser) { StringBuilder sbList = new StringBuilder(); //명령 만들기 sbList.Append(claCommand.Command.User_List.GetHashCode()); sbList.Append(claGlobal.g_Division); //리스트 만들기 foreach (claUser insUser_Temp in m_listUser) { sbList.Append(insUser_Temp.UserID); sbList.Append(","); } //요청에 응답해준다. insUser.SendMsg_User(sbList.ToString()); }
/// <summary> /// 유저 메시지 이벤트 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void insUser_OnMessaged(claUser sender, MessageEventArgs e) { StringBuilder sbMsg = new StringBuilder(); switch (e.m_typeCommand) { case claCommand.Command.Msg: //메시지 sbMsg.Append(sender.UserID); sbMsg.Append(" : "); sbMsg.Append(e.m_strMsg); Commd_SendMsg(sbMsg.ToString()); break; case claCommand.Command.ID_Check: //id체크 Commd_IDCheck(sender, e.m_strMsg); break; case claCommand.Command.User_List_Get: //유저 리스트 갱신 요청 Commd_User_List_Get(sender); break; } }
/// <summary> /// 유저 끊김 이벤트 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void insUser_OnDisconnected(claUser sender) { StringBuilder sbMsg = new StringBuilder(); sbMsg.Append(" *** "); sbMsg.Append(sender.UserID); sbMsg.Append(" : 접속 끊김 *** "); //로그리스트에서 유저를 지움 //출력 this.Invoke(new Action( delegate() { listUser.Items.RemoveAt(listUser.FindString(sender.UserID)); })); //로그 기록 DisplayLog(sbMsg.ToString()); //리스트에서 유저를 지움 m_listUser.Remove(sender); //전체 유저에게 메시지 전송 AllUser_Send(sbMsg.ToString()); }
/// <summary> /// 클라이언트가 연결되면 발생 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Accept_Completed(object sender, SocketAsyncEventArgs e) { //클라이언트 접속 //유저 객체를 만든다. claUser insUser = new claUser(e.AcceptSocket); //각 이벤트 연결 insUser.OnConnected += insUser_OnConnected; insUser.OnDisconnected += insUser_OnDisconnected; insUser.OnMessaged += insUser_OnMessaged; //리스트에 클라이언트 추가 m_listUser.Add(insUser); //서버에 접속자 리스트 표시 DisplayLog(" --- 유저 접속 시작 --- "); //다시 클라이언트 접속을 기다린다. Socket socketServer = (Socket)sender; e.AcceptSocket = null; socketServer.AcceptAsync(e); }