예제 #1
0
        private void HandleCmd(Socket client, String cmd)
        {
            try
            {
                SocketMessage sm = new SocketMessage();
                sm.Client         = clients[client];
                sm.Time           = DateTime.Now;
                sm.isLoginMessage = false;
                if (cmd.StartsWith("<NewGame>"))
                {
                    Console.WriteLine("<NewGame>" + gameId);
                    int size = Convert.ToInt32(cmd.Substring(9));
                    lock (lockGameId)
                    {
                        sm.Message             = "#NewGame" + gameId + "";
                        clients[client].roomId = gameId;
                        GameRoom room = new GameRoom(clients[client], gameId, size);
                        this.rooms.Add(gameId, room);
                        gameId++;
                    }
                    clients[client].IsCreater = true;

                    byte[] msgs = PackageServerData(sm);
                    client.Send(msgs, msgs.Length, SocketFlags.None);
                }
                else if (cmd.StartsWith("<EnterGame>"))
                {
                    //<EnterGame>1
                    String roomId = cmd.Substring(11);
                    Console.WriteLine("<EnterGame>" + roomId);
                    Console.WriteLine(roomId);
                    if (rooms.ContainsKey(Convert.ToInt32(roomId)) && rooms[Convert.ToInt32(roomId)].enemy == null)
                    {
                        rooms[Convert.ToInt32(roomId)].enemy = clients[client];
                        sm.Message             = "#GameStart" + rooms[Convert.ToInt32(roomId)].size;
                        clients[client].roomId = Convert.ToInt32(roomId);
                        byte[] msgs = PackageServerData(sm);
                        client.Send(msgs, msgs.Length, SocketFlags.None);
                        rooms[Convert.ToInt32(roomId)].creater.socket.Send(msgs, msgs.Length, SocketFlags.None);
                        clients[client].IsCreater = false;
                    }
                    else
                    {
                        Console.WriteLine("rooms.ContainsKey(Convert.ToInt32(roomId):" + rooms.ContainsKey(Convert.ToInt32(roomId)));

                        String msg  = "#Msg" + "InvalidRoomId";
                        byte[] msgs = PackageServerData(msg);
                        client.Send(msgs, msgs.Length, SocketFlags.None);
                    }
                }
                else if (cmd.StartsWith("<Place>"))
                {
                    Console.WriteLine("<Place>");
                    String pix = cmd.Substring(7);
                    sm.Message = "#Place" + pix;
                    byte[] msgs = PackageServerData(sm);
                    if (clients[client].IsCreater)
                    {
                        rooms[clients[client].roomId].enemy.socket.Send(msgs, msgs.Length, SocketFlags.None);
                    }
                    else
                    {
                        rooms[clients[client].roomId].creater.socket.Send(msgs, msgs.Length, SocketFlags.None);
                    }
                }
                else if (cmd.StartsWith("<EndGame>"))
                {
                    Console.WriteLine("<EndGame>");
                    String pix = cmd.Substring(7);
                    sm.Message = "#EndGame" + pix;
                    byte[] msgs = PackageServerData(sm);
                    rooms[clients[client].roomId].creater.socket.Send(msgs, msgs.Length, SocketFlags.None);
                    rooms[clients[client].roomId].enemy.socket.Send(msgs, msgs.Length, SocketFlags.None);
                }
                else if (cmd.StartsWith("<Undo>"))
                {
                    Console.WriteLine("<Undo>");
                    String pix = cmd.Substring(6);
                    sm.Message = "#Undo" + pix;
                    byte[] msgs = PackageServerData(sm);
                    if (clients[client].IsCreater)
                    {
                        rooms[clients[client].roomId].enemy.socket.Send(msgs, msgs.Length, SocketFlags.None);
                    }
                    else
                    {
                        rooms[clients[client].roomId].creater.socket.Send(msgs, msgs.Length, SocketFlags.None);
                    }
                }
                else if (cmd.StartsWith("<Surrender>"))
                {
                    Console.WriteLine("<Surrender>");
                    sm.Message = "#Surrender";
                    byte[] msgs = PackageServerData(sm);
                    if (clients[client].IsCreater)
                    {
                        rooms[clients[client].roomId].enemy.socket.Send(msgs, msgs.Length, SocketFlags.None);
                    }
                    else
                    {
                        rooms[clients[client].roomId].creater.socket.Send(msgs, msgs.Length, SocketFlags.None);
                    }
                }
                else if (cmd.StartsWith("<ReStart>"))
                {
                    Console.WriteLine("<ReStart>");
                    sm.Message = "#ReStart";
                    byte[] msgs = PackageServerData(sm);
                    if (clients[client].IsCreater)
                    {
                        rooms[clients[client].roomId].enemy.socket.Send(msgs, msgs.Length, SocketFlags.None);
                    }
                    else
                    {
                        rooms[clients[client].roomId].creater.socket.Send(msgs, msgs.Length, SocketFlags.None);
                    }
                }
                else if (cmd.StartsWith("<Msg>"))
                {
                    Console.WriteLine("<Msg>");
                    String msg = cmd.Substring(5);
                    sm.Message = "#Msg" + msg;
                    byte[] msgs = PackageServerData(sm);
                    if (clients[client].IsCreater)
                    {
                        rooms[clients[client].roomId].enemy.socket.Send(msgs, msgs.Length, SocketFlags.None);
                    }
                    else
                    {
                        rooms[clients[client].roomId].creater.socket.Send(msgs, msgs.Length, SocketFlags.None);
                    }
                }
                else if (cmd.StartsWith("<Bye>"))
                {
                    Console.WriteLine("<Bye>");
                    disconnect(client);
                }
                else if (cmd.StartsWith("<RandomRoom>"))
                {
                    Console.WriteLine("<RandomRoom>");
                    String msg = "#RandomRoom";
                    lock (lockWaitingQueue)
                    {
                        if (waitingQueue.Count > 0)
                        {
                            clients[client].IsCreater = false;
                            Socket creater = waitingQueue.Dequeue() as Socket;
                            clients[client].roomId = clients[creater].roomId;
                            rooms[clients[creater].roomId].enemy = clients[client];
                            byte[] msgsRed = PackageServerData(msg + "Red");
                            creater.Send(msgsRed, msgsRed.Length, SocketFlags.None);
                            byte[] msgsBlue = PackageServerData(msg + "Blue");
                            client.Send(msgsBlue, msgsBlue.Length, SocketFlags.None);
                        }
                        else
                        {
                            clients[client].IsCreater = true;
                            lock (lockGameId)
                            {
                                clients[client].roomId = gameId;
                                GameRoom room = new GameRoom(clients[client], gameId, 12);
                                this.rooms.Add(gameId, room);
                                gameId++;
                            }
                            waitingQueue.Enqueue(client);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
예제 #2
0
        private void Recieve(IAsyncResult result)
        {
            Socket client = result.AsyncState as Socket;

            if (client == null || !clients.ContainsKey(client))
            {
                return;
            }
            try
            {
                if (!SocketConnected(client))
                {
                    disconnect(client);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Recieve Error:" + ex);
            }

            try
            {
                int    length = client.EndReceive(result);
                byte[] buffer = clients[client].buffer;

                //接收消息
                client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(Recieve), client);
                string msg = Encoding.UTF8.GetString(buffer, 0, length);

                if (!clients[client].IsHandShaked && msg.Contains("Sec-WebSocket-Key"))
                {
                    client.Send(PackageHandShakeData(buffer, length));
                    clients[client].IsHandShaked = true;
                    return;
                }

                msg = AnalyzeClientData(buffer, length);

                SocketMessage sm = new SocketMessage();
                sm.Client = clients[client];
                sm.Time   = DateTime.Now;

                Regex reg = new Regex(@"{<(.*?)>}");
                Match m   = reg.Match(msg);
                if (m.Value != "")
                { //处理客户端传来的用户名
                    clients[client].NickName = Regex.Replace(m.Value, @"{<(.*?)>}", "$1");
                    sm.isLoginMessage        = true;
                    sm.Message = "login!";
                    Console.WriteLine("{0} login @{1}", client.RemoteEndPoint, DateTime.Now);
                }
                else
                { //处理客户端传来的普通消息
                    HandleCmd(client, msg);
                    sm.isLoginMessage = false;
                    sm.Message        = msg;
                    Console.WriteLine("{0} @ {1}\r\t{2}", clients[client].Name, DateTime.Now, sm.Message);
                }
                msgPool.Add(sm);
            }
            catch (Exception ex)
            {
                try
                {
                    disconnect(client);
                }
                catch (Exception exx)
                {
                    Console.WriteLine(exx);
                }
            }
        }