public void ClearTitle(SocketConnection sConn)
 {
     type = "_over";
     titleList.Clear();
     userList.Clear();
     Send("ReviceClearTitle|" + sConn.Name);
 }
        public void StartGame(JObject jo, SocketConnection sConn)
        {
            userList.Remove(sConn.Name);
            judge = sConn.Name;

            string msg;
            if (titleList.Count != userList.Count)
            {
                msg = string.Format("ReviceStartGame|False|抱歉,出题要求{0}人参加,但现在只有{1}人,所以游戏启动失败!", titleList.Count, userList.Count);
                Send(msg);
            }
            else
            {
                var num = Rank();
                speak = userList[0];

                var i = 0;
                foreach (var item in connectionSocketList)
                {
                    if (item.Name != sConn.Name)
                    {
                        var title = titleList[num[i] - 1];
                        msg = string.Format("ReviceStartGame|True|游戏开始,{1}开始发言!|{0}|{1}", title, speak);

                        if (!userTitle.ContainsKey(item.Name))
                            userTitle.Add(item.Name, title);
                        i++;
                    }
                    else
                    {
                        type = "_game";
                        msg = string.Format("ReviceStartGame|True|游戏开始,{0}开始发言!|你是法官|{0}", speak);
                    }
                    var dr = new DataFrame(msg);
                    item.ConnectionSocket.Send(dr.GetBytes());
                }
            }
        }
        public void VoteUser(JObject jo, SocketConnection sConn)
        {
            var userName = jo["UserName"].ToString();
            var voteUser = jo["VoteUser"].ToString();

            if (!voteList.ContainsKey(userName))
            {
                voteList.Add(userName, voteUser);
            }
            else
            {
                const string message = "ReviceVote|Flase|你已经投过票了,请不要重复投票!";
                var dr = new DataFrame(message);
                sConn.ConnectionSocket.Send(dr.GetBytes());
                return;
            }

            if (userList.Count != voteList.Count) return;

            var result = voteList.GroupBy(d => d.Value).Select(
                n => new
                {
                    Count = n.Count(),
                    value = n.FirstOrDefault().Value
                }).OrderByDescending(n => n.Count).ToList();

            var voteTxt = voteList.Aggregate("", (current, vote) => current + (":" + vote.Key + ":" + vote.Value));

            string resultVote = null;
            for (var i = 0; i < result.Count - 1; i++)
            {
                if (result[i].Count == result[i + 1].Count)
                {
                    resultVote += "," + result[i + 1].value;
                }
                else
                {
                    break;
                }
            }

            string style;
            string isOver;
            if (resultVote == null)
            {
                userList.Remove(result[0].value);
                resultVote = string.Format("{0}获得了{1}票,所以{0}出局!", result[0].value, result[0].Count);
                isOver = IsOver(result[0].value, userTitle[result[0].value]);
                style = "Kill";
            }
            else
            {
                resultVote = string.Format("{0}等人票数相同,都是{1}票,所以进行PK!", result[0].value + resultVote, result[0].Count);
                style = "Pk";
                isOver = "continue";
            }

            voteList.Clear();

            var msg = string.Format("ReviceVote|True|{0}|{1}|{2}|{3}|{4}|{5}", voteTxt, style, resultVote,
                                    result[0].value, userList[0], isOver);
            Send(msg);

            speak = userList[0];

            if (isOver == "_over")
            {
                GameOver();
            }
        }
        public void SendTitle(JObject jo, SocketConnection sConn)
        {
            var userName = jo["UserName"].ToString();
            string msg;
            if (titleList.Count == 0)
            {
                var requestPeople = jo["People"].ToString();
                var requestGhost = jo["Ghost"].ToString();
                var requestPeopleNum = Convert.ToInt32(jo["PeopleNum"].ToString());
                var requestGhostNum = Convert.ToInt32(jo["GhostNum"].ToString());
                var requestXiaoBai = Convert.ToInt32(jo["XiaoBai"].ToString());

                titleUserName = userName;
                people = requestPeople;
                ghost = requestGhost;
                peopleNum = requestPeopleNum;
                ghostNum = requestGhostNum;

                for (var i = 0; i < requestPeopleNum; i++)
                {
                    titleList.Add(requestPeople);
                }
                for (var i = 0; i < requestGhostNum; i++)
                {
                    titleList.Add(requestGhost);
                }
                for (var i = 0; i < requestXiaoBai; i++)
                {
                    titleList.Add("你是小白,伤不起");
                }
                type = "_plan";
                msg = string.Format("ReviceTitle|{0}已出题,请要参加的人员,赶快准备!|{0}", userName);
                Send(msg);
            }
            else
            {
                msg = string.Format("ReviceTitle|出题失败!{0}已出题,请先完成当前题目!!", titleUserName);
                var dr = new DataFrame(msg);
                sConn.ConnectionSocket.Send(dr.GetBytes());
            }
        }
 public void Plan(JObject jo, SocketConnection sConn)
 {
     var user = jo["UserName"].ToString();
     string msg;
     if (!userList.Contains(user))
     {
         userList.Add(user);
         msg = string.Format("RevicePlan|True|{0}", user);
         Send(msg);
     }
     else
     {
         msg = string.Format("RevicePlan|False|你要爪子,准备了还点。。");
         var dr = new DataFrame(msg);
         sConn.ConnectionSocket.Send(dr.GetBytes());
     }
 }
        public void Login(JObject jo, SocketConnection sConn)
        {
            string msg;
            var user = jo["UserName"].ToString();

            var name = connectionSocketList.Where(b => b.Name == user);
            if (name.Count() != 0)
            {
                msg = "Login|False|用户名已被使用!";
                SendUser(msg, sConn);
                Logger.Log(Enums.LogType.Error, "用户名【" + user + "】已经被使用");

                sConn.ConnectionSocket.Close();
                connectionSocketList.Remove(sConn);
            }
            else
            {
                sConn.Name = user;
                msg = "Login|True|" + user + "|";
                msg += connectionSocketList.Aggregate("", (current, list) => current + ("," + list.Name));
                msg += "|";
                msg += userList.Aggregate("", (current, list) => current + ("," + list));
                msg += "|" + type;
                msg += "|" + titleUserName;
                Send(msg);

                Logger.Log(Enums.LogType.Login, user);
            }
        }
        public void StartServer()
        {
            listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
            //var address = IPAddress.Parse(ServerIp);
            listener.Bind(new IPEndPoint(GetLocalmachineIpAddress(), ServerPort));
            listener.Listen(connectionsQueueLength);

            Logger.Log(Enums.LogType.Start, string.Format("聊天服务器启动。监听地址:{0}, 端口:{1}", GetLocalmachineIpAddress(), ServerPort));
            Logger.Log(Enums.LogType.Start, string.Format("WebSocket服务器地址: ws://{0}:{1}/chat", GetLocalmachineIpAddress(), ServerPort));

            while (true)
            {
                var sc = listener.Accept();
                System.Threading.Thread.Sleep(100);

                var socketConn = new SocketConnection { ConnectionSocket = sc };
                socketConn.DataReceived += socketConn_DataReceived;
                socketConn.Disconnected += socketConn_Disconnected;

                socketConn.ConnectionSocket.BeginReceive(socketConn.ReceivedDataBuffer,
                                                         0, socketConn.ReceivedDataBuffer.Length,
                                                         0, socketConn.ManageHandshake,
                                                         socketConn.ConnectionSocket.Available);
                connectionSocketList.Add(socketConn);
            }
            // ReSharper disable FunctionNeverReturns
        }
 // ReSharper restore FunctionNeverReturns
 public void SendUser(string message, SocketConnection item)
 {
     if (!item.ConnectionSocket.Connected) return;
     Logger.Log(Enums.LogType.Msg, message);
     try
     {
         if (item.IsDataMasked)
         {
             var dr = new DataFrame(message);
             item.ConnectionSocket.Send(dr.GetBytes());
         }
         else
         {
             item.ConnectionSocket.Send(firstByte);
             item.ConnectionSocket.Send(Encoding.UTF8.GetBytes(message));
             item.ConnectionSocket.Send(lastByte);
         }
     }
     catch (Exception ex)
     {
         Logger.Log(Enums.LogType.Error, ex.Message);
     }
 }