예제 #1
0
        public void doDealMsg(byte[] buffer, NetworkStream streamToClient, TcpClient client, List <TcpClient> clients)
        {
            byte[] temp;//临时变量
            Console.WriteLine(getRequest(buffer));
            switch (getRequest(buffer))
            {
            case CommandParam.LOGIN_REQUEST:
                //登录验证
                UserInfo userInfo   = new UserInfo();
                bool     isExitUser = ConectMySqldb.queryUserInfoByUserName(getUsername(buffer), userInfo);
                if (isExitUser)
                {
                    Console.Write("\nusername: {0} ,password: {1} ", userInfo.username, userInfo.password);
                    temp = userInfo.WriteAsBytes(CommandParam.LOGIN_SUCCESS_REPLY);    //返回登陆成功回应
                    try
                    {
                        Name2Client.Add(client, userInfo.username);    //绑定用户名和客户端
                        streamToClient.Write(temp, 0, temp.Length);
                        Console.WriteLine("ClientsCount:{0},Client:{1},username:{2}", Name2Client.Count, Name2Client.ElementAt(0).Key.Client.RemoteEndPoint, Name2Client.ElementAt(0).Value);
                    }
                    catch (ArgumentException ex)
                    {
                        sendOnlyReply(CommandParam.LOGIN_FAIL_REPLY, streamToClient);
                        Console.WriteLine("此用户已经存在:" + ex.Message);
                    }
                }
                else
                {
                    sendOnlyReply(CommandParam.LOGIN_FAIL_REPLY, streamToClient);    //返回失败成功回应
                }
                break;

            case CommandParam.LOADING_REQUEST:
                //载入请求
                ReviewInfo reviewInfo = new ReviewInfo();
                ConectMySqldb.queryReviewInfoByUserName(getUsername(buffer), reviewInfo);
                temp = reviewInfo.WriteAsBytes(CommandParam.LOADING_SUCCESS_REPLY);    //返回载入成功回应
                streamToClient.Write(temp, 0, temp.Length);
                Console.WriteLine("\nbattleNum:{0},victoryNum:{1},escapeNum:{2},singlehighestScore:{3},totalScore:{4}", reviewInfo.battleNum, reviewInfo.victoryNum, reviewInfo.escapeNum, reviewInfo.singlehighestScore, reviewInfo.totalScore);

                break;

            case CommandParam.UPDATE_REQUEST:
                //更新请求
                ReviewInfo new_reviewInfo = new ReviewInfo();
                new_reviewInfo.ReadByBytes(buffer);
                bool isUpdate = ConectMySqldb.updateReviewInfo(new_reviewInfo);
                if (isUpdate)
                {
                    Console.WriteLine("更新成功");
                }
                else
                {
                    Console.WriteLine("更新失败"); sendOnlyReply(CommandParam.UPDATE_FAIL_REPLY, streamToClient);
                }
                break;

            case CommandParam.MATCH_REQUEST:
                //匹配请求
                Console.WriteLine("yes");
                bool isready = getIsReady(buffer, GameState);
                if (clients.Count < 2 || !isready)
                {
                    sendOnlyReply(CommandParam.MATCH_FAIL_REPLY, streamToClient);    //返回匹配失败回应
                }
                else if (clients.Count == 2 && isready)
                {
                    sendOnlyReply(CommandParam.MATCH_SUCCESS_REPLY, streamToClient);    //返回匹配成功回应
                }
                else
                {
                    sendOnlyReply(CommandParam.MATCH_FAIL_REPLY, streamToClient);    //返回匹配失败回应
                                                                                     //return;
                }
                break;

            case CommandParam.BATTLE_REQUEST:
                //发送指令
                if (clients.ElementAt(0) == client)
                {
                    sendToTargetClient(clients.ElementAt(1), buffer);
                    Console.WriteLine("send to {0}", clients.ElementAt(1).Client.RemoteEndPoint);
                }
                else if (clients.ElementAt(1) == client)
                {
                    sendToTargetClient(clients.ElementAt(0), buffer);
                    Console.WriteLine("send to {0}", clients.ElementAt(0).Client.RemoteEndPoint);
                }
                break;

            default:
                sendOnlyReply(CommandParam.IS_ONLINE, streamToClient);    //心跳机制
                break;
            }
        }
예제 #2
0
        /// <summary>
        /// 服务器接受客户端消息时执行
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e">接受数据参数-Tcpclient,byte[]</param>
        static void server_DatagramReceived(object sender, TcpDatagramReceivedEventArgs <byte[]> e)
        {
            //TODO
            int headData = DataHandleHelper.getHeadData(e.Datagram);

            byte[] receviceData = e.Datagram;
            string username;
            bool   isExist;
            int    battleCode;

            switch (headData)
            {
            case CommandParam.LOGIN_REQUEST:
                //登陆请求
                username = DataHandleHelper.getStringParam(receviceData);
                UserInfo userInfo = new UserInfo();
                isExist = ConectMySqldb.queryUserInfoByUserName(username, userInfo);
                if (isExist)
                {
                    if (onLineList.ContainsKey(e.TcpClient) || onLineList.ContainsValue(username))
                    {
                        userInfo = new UserInfo();    //已存在用户或客户端,返回空值
                    }
                    else
                    {
                        onLineList.Add(e.TcpClient, username);
                    }
                }
                else
                {
                    userInfo = new UserInfo();
                }
                //返回数据
                server.Send(e.TcpClient, userInfo, CommandParam.LOGIN_RETURN);
                break;

            case CommandParam.LOADING_REQUEST:
                //载入请求
                username = DataHandleHelper.getStringParam(receviceData);
                ReviewInfo reviewInfo = new ReviewInfo();
                isExist = ConectMySqldb.queryReviewInfoByUserName(username, reviewInfo);
                if (!isExist)
                {
                    reviewInfo = new ReviewInfo();    //不存在,返回空值
                }
                //返回数据
                server.Send(e.TcpClient, reviewInfo, CommandParam.LOAD_RETURN);
                break;

            case CommandParam.MATCH_REQUEST:
                //匹配请求

                MatchInfo matchInfo = new MatchInfo();
                if (linelist.Count == 0)
                {
                    linelist.Add(e.TcpClient);
                    matchInfo.isMatch    = 0;
                    matchInfo.battleCode = -1;
                }
                else if (linelist.Count == 1)
                {
                    if (linelist.Contains(e.TcpClient))
                    {
                        matchInfo.isMatch    = 0;
                        matchInfo.battleCode = -1;
                    }
                    else
                    {
                        TcpClient emeny = linelist.ElementAt(0);
                        linelist.Remove(emeny);    //移除第一个匹配的元素
                        TcpClient[] battle = new TcpClient[] { emeny, e.TcpClient };
                        battleList.Add(battle);
                        matchInfo.isMatch    = 1;
                        matchInfo.battleCode = battleList.IndexOf(battle);    //在对战列表的位置
                    }
                }
                else
                {
                    matchInfo.isMatch    = 0;
                    matchInfo.battleCode = -1;
                }
                //返回数据
                server.Send(e.TcpClient, matchInfo, CommandParam.MATCH_RETURN);
                break;

            case CommandParam.BATTLE_REQUEST:
                //战斗数据交换
                battleCode = DataHandleHelper.getIntParam(receviceData);
                BattleInfo battleInfo = new BattleInfo();
                battleInfo.ReadByBytes(receviceData);

                if (battleCode < 0)
                {
                    return;    //找不到战斗列表
                }
                else
                {
                    foreach (var p in battleList.ElementAt(battleCode))
                    {
                        if (p != e.TcpClient)
                        {
                            TcpClient target = p;
                            battleInfo.setBattelCode(battleCode);
                            server.Send(target, battleInfo, CommandParam.BATTLE_RETURN);
                        }
                    }
                }
                break;

            case CommandParam.UPDATE_REQUEST:
                //更新数据
                ReviewInfo updatereviewInfo = new ReviewInfo();
                updatereviewInfo.ReadByBytes(receviceData);
                UpdateInfo updateInfo = new UpdateInfo();
                bool       isUpdate   = ConectMySqldb.updateReviewInfo(updatereviewInfo);
                if (isUpdate)
                {
                    updateInfo.isUpdate = 1;
                }
                else
                {
                    updateInfo.isUpdate = 0;
                }
                //返回数据
                server.Send(e.TcpClient, updateInfo, CommandParam.UPDATE_RETURN);
                break;

            case CommandParam.FINSH_REQUEST:
                battleCode = DataHandleHelper.getIntParam(receviceData);
                if (battleList.ElementAt(battleCode) != null)
                {
                    battleList.RemoveAt(battleCode);
                }
                server.Send(e.TcpClient, "Gamerover");
                break;

            default:
                server.Send(e.TcpClient, "参数错误");
                break;
            }
        }
예제 #3
0
        /// <summary>
        /// 消息接受,回调函数,执行以下功能
        /// 登陆验证
        /// 载入请求
        /// 匹配请求
        /// 发送指令
        /// </summary>
        /// <param name="ar">异步回调的结果</param>
        private void ReadComplete(IAsyncResult ar)
        {
            int byteRead = 0;

            byte[] temp;//临时变量
            try
            {
                byteRead = streamToClient.EndRead(ar);//接受消息长度

                if (byteRead == 0)
                {
                    Console.WriteLine("Client offine");
                    return;
                }
                Console.WriteLine(getRequest(buffer));
                switch (getRequest(buffer))
                {
                case CommandParam.LOGIN_REQUEST:
                    //登录验证
                    UserInfo userInfo   = new UserInfo();
                    bool     isExitUser = ConectMySqldb.queryUserInfoByUserName(getUsername(buffer), userInfo);
                    if (isExitUser)
                    {
                        Console.Write("\nusername: {0} ,password: {1} ", userInfo.username, userInfo.password);
                        temp = userInfo.WriteAsBytes(CommandParam.LOGIN_SUCCESS_REPLY);    //返回登陆成功回应
                        try
                        {
                            Name2Client.Add(client, userInfo.username);    //绑定用户名和客户端
                            streamToClient.Write(temp, 0, temp.Length);
                            Console.WriteLine("ClientsCount:{0},Client:{1},username:{2}", Name2Client.Count, Name2Client.ElementAt(0).Key.Client.RemoteEndPoint, Name2Client.ElementAt(0).Value);
                        }
                        catch (ArgumentException ex)
                        {
                            sendOnlyReply(CommandParam.LOGIN_FAIL_REPLY, streamToClient);
                            Console.WriteLine("此用户已经存在:" + ex.Message);
                        }
                    }
                    else
                    {
                        sendOnlyReply(CommandParam.LOGIN_FAIL_REPLY, streamToClient);    //返回失败成功回应
                    }
                    break;

                case CommandParam.LOADING_REQUEST:
                    //载入请求
                    ReviewInfo reviewInfo = new ReviewInfo();
                    ConectMySqldb.queryReviewInfoByUserName(getUsername(buffer), reviewInfo);
                    temp = reviewInfo.WriteAsBytes(CommandParam.LOADING_SUCCESS_REPLY);    //返回载入成功回应
                    streamToClient.Write(temp, 0, temp.Length);
                    Console.WriteLine("\nbattleNum:{0},victoryNum:{1},escapeNum:{2},singlehighestScore:{3},totalScore:{4}", reviewInfo.battleNum, reviewInfo.victoryNum, reviewInfo.escapeNum, reviewInfo.singlehighestScore, reviewInfo.totalScore);

                    break;

                case CommandParam.UPDATE_REQUEST:
                    //更新请求
                    ReviewInfo new_reviewInfo = new ReviewInfo();
                    new_reviewInfo.ReadByBytes(buffer);
                    bool isUpdate = ConectMySqldb.updateReviewInfo(new_reviewInfo);
                    if (isUpdate)
                    {
                        Console.WriteLine("更新成功");
                    }
                    else
                    {
                        Console.WriteLine("更新失败"); sendOnlyReply(CommandParam.UPDATE_FAIL_REPLY, streamToClient);
                    }
                    break;

                case CommandParam.MATCH_REQUEST:
                    //匹配请求
                    Console.WriteLine("yes");
                    bool isready = getIsReady(buffer, GameState);
                    if (clients.Count < 2 || !isready)
                    {
                        sendOnlyReply(CommandParam.MATCH_FAIL_REPLY, streamToClient);   //返回匹配失败回应
                    }
                    else if (clients.Count == 2 && isready)
                    {
                        sendOnlyReply(CommandParam.MATCH_SUCCESS_REPLY, streamToClient);    //返回匹配成功回应
                    }
                    else
                    {
                        sendOnlyReply(CommandParam.MATCH_FAIL_REPLY, streamToClient);    //返回匹配失败回应
                        //return;
                    }
                    break;

                case CommandParam.BATTLE_REQUEST:
                    //发送指令
                    if (clients.ElementAt(0) == this.client)
                    {
                        sendToTargetClient(clients.ElementAt(1), buffer);
                        Console.WriteLine("send to {0}", clients.ElementAt(1).Client.RemoteEndPoint);
                    }
                    else if (clients.ElementAt(1) == this.client)
                    {
                        sendToTargetClient(clients.ElementAt(0), buffer);
                        Console.WriteLine("send to {0}", clients.ElementAt(0).Client.RemoteEndPoint);
                    }
                    break;

                default:
                    sendOnlyReply(CommandParam.IS_ONLINE, streamToClient);    //心跳机制
                    break;
                }

                AsyncCallback callback = new AsyncCallback(ReadComplete);
                streamToClient.BeginRead(buffer, 0, BufferSize, callback, null);
            }
            catch (Exception ex) {
                if (streamToClient != null)
                {
                    streamToClient.Dispose();
                    clients.Remove(client);
                }
                client.Close();
                Console.Write(ex.Message);
            }
        }