Beispiel #1
0
 public void Enqueue(QueueData item)
 {
     lock (que) que.Enqueue(item);
 }
 public override void Send(QueueData d)
 {
     base.Send(d);
 }
        private void Send(string IPFrom)
        {
            QueueData d = que.Dequeue();

            switch (d.code)
            {
            //클라이언트가 ChatCode.Login 코드를 보냈을 경우 닉네임의 중복 여부를 검사하고, 닉네임을 바꾼다.
            case ChatCode.LogIn:
                int a = 0;
                while (NickCheck(d.msgFrom) || d.msgFrom == "")
                {
                    d.msgFrom = "손님" + (list.Count + a);
                    a++;
                }
                if (a > 0)
                {
                    string msg = "이미 등록된 대화명입니다\r\n" +
                                 "대화명은 자동으로 설정됩니다 : " +
                                 "[" + d.msgFrom + "]";
                    list[IPFrom].Send(new QueueData(msg));
                }
                nlist.Add(d.msgFrom, IPFrom);
                list[IPFrom].Send(new QueueData(ChatCode.StartInfo, d.msgFrom));
                userNotify.Add(d.msgFrom, 0);

                SendToAll(d);
                break;

            //클라이언트가 로그아웃했을 경우 딕셔너리에 있는 데이터를 삭제하고 클라이언트의 쓰레드 종료
            case ChatCode.LogOut:
                Client c = list[IPFrom];
                list.Remove(IPFrom);
                nlist.Remove(d.msgFrom);
                userNotify.Remove(d.msgFrom);
                SendToServer(d);
                SendToAll(d);
                c.Stop();
                break;

            //ChatCode.Kick 코드를 받을경우 서버와 전체에 강제퇴장을 알리고 클라이언트과의 연결중인 소켓을 종료
            case ChatCode.Kick:
                int    b = 0;
                Client s;
                while (NickCheck(d.msgTo))
                {
                    b++;
                }
                if (b > 0)
                {
                    string msg = "[" + d.msgTo + "]" + " 님은 강제퇴장 당하셨습니다.";
                    list[IPFrom].Send(new QueueData(msg));
                }
                list.TryGetValue(d.msgTo, out s);
                list.Remove(d.msgTo);
                nlist.Remove(d.msgFrom);
                SendToServer(d);
                SendToAll(d);
                s.Stop();
                break;

            //전체 메세지
            case ChatCode.Msg:
                SendToAll(d, list[IPFrom]);
                break;

            //귓속말
            case ChatCode.Whisper:
                Whisper(d);
                break;

            //전체 쪽지
            case ChatCode.AllMessage:
                SendToAll(d, list[IPFrom]);
                break;

            //건의 사항
            case ChatCode.Inquiry:
                d.msgTo = "Check";
                break;

            case ChatCode.Notify:
                int val;
                userNotify.TryGetValue(d.msgTo, out val);
                userNotify[d.msgTo] = val + 1;
                userNotify.TryGetValue(d.msgTo, out val);
                if (val >= 5)
                {
                    d.code    = ChatCode.Kick;
                    d.msgFrom = d.msgTo;
                    d.msgTo   = null; d.msg = "신고 누적으로 인하여";
                    kick(d);
                    SendToAll(d);
                }
                break;
            }

            SendToServer(d);
        }
 public void Whisper(QueueData d)
 {
     SendToOne(d, list[nlist[d.msgTo]]);
 }
 //한명에게만 Send
 public void SendToOne(QueueData d, Client c)
 {
     c.Send(d);
 }
 //서버가 자기 자신의 ui에 보낸 메세지를 적기위한 함수
 public void WriteServerChat(QueueData d)
 {
     SendToUI(d);
 }