コード例 #1
0
        //函数中的传送的数据有问题,目前仅为测试
        static void Handler()
        {
            DeliveryData deliveryData = new DeliveryData();

            while (true)
            {
                //等待获得客户的请求
                HttpListenerContext context = httpListener.GetContext();
                if (IsOverTime(5000))
                {
                    commonData.InitData();
                    commonData.mapData = GenerateMaps();
                    GenerateReverseIndex();
                    deliveryData.InitData();
                    Console.WriteLine("服务器已经重置");
                }

                #region 状态机,本例中,通过URL传过来的数据只需要时间戳和打击的坐标轴即可
                //防止恶意URL
                string str_timestamp;
                if (context.Request.QueryString["timestamp"] != null)
                {
                    str_timestamp = context.Request.QueryString["timestamp"];
                }
                else
                {
                    continue;
                }
                if (!commonData.list_timestamp.Contains(str_timestamp))
                {
                    TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
                    str_timestamp = ts.TotalMilliseconds.ToString();
                    commonData.list_timestamp.Add(str_timestamp);
                }
                //确定请求发出方
                deliveryData.cur_timestamp = str_timestamp;
                deliveryData.player_idx    = commonData.list_timestamp.IndexOf(str_timestamp);
                if (commonData.list_timestamp.Count >= 2)
                {
                    deliveryData.isPlayerReady = true;
                }
                if (deliveryData.player_idx < 2)//如果此时是玩家的请求
                {
                    if (context.Request.QueryString["mapidx"] != null)
                    {
                        int mapidx = 0;
                        int.TryParse(context.Request.QueryString["mapidx"], out mapidx);
                        if (commonData.mapData[1 - deliveryData.player_idx, mapidx] == MapGridStatus.Blank)
                        {
                            commonData.mapData[1 - deliveryData.player_idx, mapidx] = MapGridStatus.BlankChosen;
                            commonData.list_ready[deliveryData.player_idx]          = false;
                            commonData.list_ready[1 - deliveryData.player_idx]      = true;
                        }
                        else if (commonData.mapData[1 - deliveryData.player_idx, mapidx] == MapGridStatus.Ship)
                        {
                            commonData.mapData[1 - deliveryData.player_idx, mapidx] = MapGridStatus.ShipChosen;
                            SetBlankChosen(1 - deliveryData.player_idx, mapidx);
                            commonData.list_leftShip[1 - deliveryData.player_idx]--;
                            if (commonData.list_leftShip[1 - deliveryData.player_idx] == 0)
                            {
                                deliveryData.isGameOver = true;
                                deliveryData.winner_idx = deliveryData.player_idx;
                            }
                        }
                    }
                    else
                    {
                        deliveryData.isReady = commonData.list_ready[deliveryData.player_idx];
                    }
                }
                else
                {
                    //观众处理
                }

                #endregion

                //刷新数据
                deliveryData.mapData = (MapGridStatus[, ])commonData.mapData.Clone();
                if (deliveryData.player_idx < 2)
                {
                    deliveryData.CleanMapData(1 - deliveryData.player_idx);
                }

                //传回的响应
                HttpListenerResponse response = context.Response;
                last_response = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalMilliseconds;
                //服务端上显示连接记录
                Console.WriteLine("player: {0} linked, id: {1}", context.Request.Url, commonData.list_timestamp[deliveryData.player_idx]);
                //传输数据部分
                byte[] buffer = SerializeHelper.SerializeToBinary(deliveryData);
                using (Stream output = response.OutputStream)
                {
                    output.Write(buffer, 0, buffer.Length);
                }
            }
        }