//函数中的传送的数据有问题,目前仅为测试 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); } } }