超时时间改为20s

This commit is contained in:
lishuo 2026-02-03 11:38:29 +08:00
parent 163eb686f0
commit 01aa33ba94
3 changed files with 36 additions and 491 deletions

View File

@ -53,7 +53,7 @@ namespace OnlineUserPool.Model
{
get
{
return DateTime.Now.Subtract(LastActiveTime).TotalSeconds > 60;
return DateTime.Now.Subtract(LastActiveTime).TotalSeconds > 20;
}
}

View File

@ -64,11 +64,6 @@ namespace OnlineUserPool.Model
set => SetProperty(ref _TotalTicks, value);
}
///// <summary>
///// 需要展示的属性
///// </summary>
//public string Prop { get; set; }
private double _PreDistance = 0;
public double PreDistance {
get => _PreDistance;
@ -83,8 +78,6 @@ namespace OnlineUserPool.Model
//public bool IsVirtual { get; set; }
//public double Power { get; set; }
//public double Weight { get; set; }
/// <summary>
/// 功率体重比
/// </summary>
@ -106,12 +99,10 @@ namespace OnlineUserPool.Model
set => SetProperty(ref _Saved, value);
}
//public bool ShowVirtual { get; set; }
private int _FrameRate = 0;
public int FrameRate {
get => _FrameRate;
set => SetProperty(ref _FrameRate, value);
private int _Frame = 0;
public int Frame {
get => _Frame;
set => SetProperty(ref _Frame, value);
}
private int _RoomId = 0;
@ -133,18 +124,35 @@ namespace OnlineUserPool.Model
get => _Model;
set => SetProperty(ref _Model, value);
}
private string _UserName;
public string UserName {
get => _UserName;
set => SetProperty(ref _UserName, value);
}
private string _RouteName;
public string RouteName {
get => _RouteName;
set => SetProperty(ref _RouteName, value);
}
private string _WxHeadImage;
public string WxHeadImage {
get => _WxHeadImage;
set => SetProperty(ref _WxHeadImage, value);
}
public string ToString(int v)
public override string ToString()
{
if (v == 2)
{
return $"{ RouteId },{ MemberId },{ string.Join(":", Point) },{ Convert.ToInt32(IsCompleted) },{ Speed },{ PreDistance },{ EndDistance },{ WeightKg },{ CompetitionId },{ Convert.ToInt32(Saved)},{ Power} ,{ HeartRate},{ Cadence},{ TotalTicks},{ FrameRate},{RoomId},{StartTime}";
}
return $"{ RouteId },{ MemberId },{ string.Join(":", Point) },{ Convert.ToInt32(IsCompleted) },{ Speed },{ PreDistance },{ EndDistance },{ WeightKg },{ CompetitionId },{ Convert.ToInt32(Saved)}";
return $"{RouteName},{RouteId},{UserName},{MemberId},{WxHeadImage},{string.Join(":", Point)},{Speed},{PreDistance},{EndDistance},{WeightKg},{Power},{HeartRate},{Cadence},{TotalTicks},{Convert.ToInt32(IsCompleted)},{Frame}";
}
public void Update(MsgModel model)
{
this.RouteName = model.RouteName;
this.UserName = model.UserName;
this.WxHeadImage = model.WxHeadImage;
this.CompetitionId = model.CompetitionId;
this.EndDistance = model.EndDistance;
this.HeartRate = model.HeartRate;
@ -159,7 +167,7 @@ namespace OnlineUserPool.Model
this.HeartRate = model.HeartRate;
this.Cadence = model.Cadence;
this.TotalTicks = model.TotalTicks;
this.FrameRate = model.FrameRate;
this.Frame = model.Frame;
this.RoomId = model.RoomId;
this.StartTime = model.StartTime;
this.Request = model.Request;

View File

@ -72,17 +72,9 @@ namespace OnlineUserPool.ViewModels
private const int ROOM_TIME_OUT = 60;
private const int TOTAL_PROCESS = 100;
//private IService _udpService;
public MainWindowViewModel()
{
//初始化对战房间信息
var r = GameRoomHelper.Get();
foreach (var item in r)
{
RoomList.Add(item);
}
RoomMaxId = GameRoomHelper.GetMaxId();
//初测程序关闭事件
Application.Current.MainWindow.Closing += MainWindow_Closing;
Title = $"{ IPAddress.Any }:{ ConfigHelp.UdpPort }";
@ -118,8 +110,7 @@ namespace OnlineUserPool.ViewModels
private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
GameRoomHelper.Set(RoomList.ToList());
GameRoomHelper.SetMaxId(RoomMaxId);
}
private void ReceivedData(IPEndPoint remoteIpEndPoint, ReceiveModel msg, IService service)
@ -192,12 +183,7 @@ namespace OnlineUserPool.ViewModels
client.IsWatch = msg1.IsWatch;
}
break;
//GameRoom
case 3:
{
HandleGameRoom(msg);
}
break;
}
});
}
@ -206,12 +192,6 @@ namespace OnlineUserPool.ViewModels
{
Ticks++;
NotifyClient();
//定时保存当前房间信息
if (Ticks % 5 == 0)
{
GameRoomHelper.SetMaxId(RoomMaxId);
GameRoomHelper.Set(RoomList.ToList());
}
}
private void HandleGameRoomSaved(MsgModel msg1)
@ -248,392 +228,6 @@ namespace OnlineUserPool.ViewModels
}
}
private void HandleGameRoom(ReceiveModel msg)
{
//收
switch (msg.SubType)
{
case 0: HandleCreateGameRoom(msg); break;
case 1: HandleJoinGameRoom(msg); break;
case 2: HandleGameRoomReadyStatus(msg); break;
case 3: HandleGameRoomStart(msg); break;
case 4: HandleGameRoomKick(msg); break;
case 5: HandleGameRoomProcess(msg); break;
case 6: HandleQueryGameRoomList(msg); break;//查询房间列表
default:
break;
}
switch (msg.SubType)
{
case 0:
case 1:
case 2:
case 3:
case 4: BroadCastGameRoomList(); break;
}
}
private void SendGameRoomMessage(RoomModel gameRoom)
{
if (gameRoom == null)
return;
var list = new List<MsgModel>();
list.Add(new MsgModel()
{
V = 2,
Point = new double[] { 0d, 0d },
});
string ss = "";
if (gameRoom.List != null && gameRoom.List.Count > 0)
{
ss = string.Join("|", gameRoom.List.Select(c => c.ToString()));
}
int total = 0;
var G = $"{total}l[{gameRoom},detail{{{ss}}}]";
var temp = string.Join("|", list.Select(m => m.ToString(2))) + "|";
var strV21 = $"l{{{ temp }}};g{{{ G}}};";
var ddd = new NetworkData(strV21);
var needList = Clients.Where(c => c.RoomId == gameRoom.RoomId).ToList();
foreach (var client in needList)
{
bool isZip = client.Encoding == "gzip";
client.Service.Send(ddd.GetBytes(isZip), ddd.GetBytes(isZip).Length, client.IPEndPoint);
client.Request = "";
}
}
private void BroadCastGameRoomList()
{
//广播
var needlist = Clients.Where(c => c.Model != null && c.Model.Equals("GameRoom") && !string.IsNullOrEmpty(c.Request));
var list = new List<MsgModel>();
list.Add(new MsgModel()
{
V = 2,
Point = new double[] { 0d, 0d },
});
var temp = string.Join("|", list.Select(m => m.ToString(2))) + "|";
foreach (var item in needlist)
{
var G = GameRoomMessageHandler(item);
var strV21 = $"l{{{ temp }}};g{{{G}}};";
var ddd = new NetworkData(strV21);
bool isZip = item.Encoding == "gzip";
item.Service.Send(ddd.GetBytes(isZip), ddd.GetBytes(isZip).Length, item.IPEndPoint);
}
}
//查询房间列表
private void HandleQueryGameRoomList(ReceiveModel msg)
{
var query = msg as QueryGameRoomListCommand;
var needSend = Clients.Where(c => c.MemberId == query.UserId).FirstOrDefault();
if (needSend == null)
return;
needSend.Request = $"List/{query.PageIndex}/{query.PageSize}/{query.Name}";
var list = new List<MsgModel>();
list.Add(new MsgModel()
{
V = 2,
Point = new double[] { 0d, 0d },
});
var temp = string.Join("|", list.Where(m => m.CompetitionId == needSend.Competitionid).Select(m => m.ToString(2))) + "|";
List<RoomModel> rooms;
if (!string.IsNullOrEmpty(query.Name))
{
rooms = RoomList.ToList().Where(c => c.Name.Contains(query.Name) || c.RoomId.ToString() == query.Name).OrderBy(c => c.Status).ThenByDescending(c => c.CreateTime).ToList();
}
else
{
rooms = RoomList.ToList().OrderBy(c => c.Status).ThenByDescending(c => c.CreateTime).ToList();
}
//计算总页数
int total = 0;
if (query.PageSize != 0)
{
total = rooms.Count() / query.PageSize;
total = rooms.Count() % query.PageSize == 0 ? total : total + 1;
}
rooms = rooms.Skip(query.PageIndex * query.PageSize).Take(query.PageSize).ToList();
string roomInfo = $"{total}l";
foreach (var r in rooms)
{
string ss = "";
if (r.List != null && r.List.Count > 0)
{
ss = string.Join("|", r.List.Select(c => c.ToString()));
}
roomInfo += $"[{r.ToString()},detail{{{ss}}}]";
}
var strV21 = $"l{{{ temp }}};g{{{roomInfo}}};";
var ddd = new NetworkData(strV21);
bool isZip = needSend.Encoding == "gzip";
needSend.Service.Send(ddd.GetBytes(isZip), ddd.GetBytes(isZip).Length, needSend.IPEndPoint);
}
//创建房间
private void HandleCreateGameRoom(ReceiveModel msg)
{
var createMsg = msg as CreateGameRoomCommand;
RemoveOtherRoomInfo(createMsg.UserId, createMsg.Id);
var roomId = RoomMaxId + 1;
var list = new List<RoomDetailModel>();
list.Add(new RoomDetailModel()
{
RoomId = roomId,
UserId = createMsg.UserId,
JoinAt = DateTime.Now.ToUniversalTime(),
IsOwner = true,
});
var room = new RoomModel
{
RoomId = roomId,
Name = createMsg.Name,
Password = createMsg.Password,
CloseTime = createMsg.CloseTime,
CreateTime = createMsg.CreateTime,
MapRouteId = createMsg.RouteId,
MapRouteName = createMsg.MapRouteName,
AltitudeGraph = createMsg.AltitudeGraph,
MaxMembers = createMsg.MaxMembers,
UserId = createMsg.UserId,
AverageGrade = createMsg.AverageGrade,
TotalClimb = createMsg.TotalClimb,
Distance = createMsg.Distance,
EnableAR = createMsg.EnableAR,
Enable3D = createMsg.Enable3D,
FileName = createMsg.FileName,
FileUrl = createMsg.FileUrl,
IsLock = !string.IsNullOrEmpty(createMsg.Password),
List = list,
};
var mine = Clients.FirstOrDefault(c => c.MemberId == createMsg.UserId);
if (mine != null)
{
mine.RoomId = room.RoomId;
}
RoomList.Add(room);
RoomMaxId = room.RoomId;
}
//先移除当前用户在其他房间的信息(考虑服务器重启的时候没有响应客户端退出命令)
private void RemoveOtherRoomInfo(int userId, int roomId)
{
var preRoom = RoomList.ToList().FirstOrDefault(c => c.Status == 0 && c.List.Any(a => a.UserId == userId) && c.RoomId != roomId);
if (preRoom != null)
{
var needRemove = preRoom.List.FirstOrDefault(c => c.UserId == userId && c.Saved == false);
preRoom.List.Remove(needRemove);
if (preRoom.List.Count == 0)
{
RoomList.Remove(preRoom);
}
//发送给这个房间的人
SendGameRoomMessage(preRoom);
}
}
//处理当前用户加入房间
private void HandleJoinGameRoom(ReceiveModel msg)
{
var msg1 = msg as JoinGameRoomCommand;
RemoveOtherRoomInfo(msg1.UserId,msg1.RoomId);
var room = RoomList.ToList().FirstOrDefault(c => c.RoomId == msg1.RoomId);
var client = Clients.FirstOrDefault(n => n.MemberId.Equals(msg1.UserId));
//更新房间信息
if (room != null)
{
var list = room.List;
var member = list.FirstOrDefault(c => c.UserId == msg1.UserId);
if (member != null)
{
member.JoinAt = msg1.JoinAt;
}
else
{
//如果房间人数已经满了就拒绝加入
var currentCount = room.List.Count;
if (currentCount + 1 <= room.MaxMembers)
{
list.Add(new RoomDetailModel
{
UserId = msg1.UserId,
JoinAt = msg1.JoinAt,
RoomId = msg1.RoomId
});
if (client != null)
{
client.RoomId = room.RoomId;
client.Request = "";
}
}
}
}
//发送当前房间的信息给当前房间内的人
SendGameRoomMessage(room);
}
//处理当前用户准备状态
private void HandleGameRoomReadyStatus(ReceiveModel msg)
{
var msg1 = msg as GameRoomReadyCommand;
var room = RoomList.ToList().Where(c => c.RoomId == msg1.RoomId).FirstOrDefault();
if (room != null)
{
var list = room.List;
var member = list.Where(c => c.UserId == msg1.UserId).FirstOrDefault();
if (member != null)
{
member.Status = msg1.Status;
}
}
//发送信息给当前房间内的人
SendGameRoomMessage(room);
}
//处理当前用户准备状态
private void HandleGameRoomStart(ReceiveModel msg)
{
var msg1 = msg as GameRoomStartCommand;
var client = Clients.FirstOrDefault(c => c.MemberId == msg1.UserId);
if (client != null)
{
client.RoomId = msg1.RoomId;
}
var room = RoomList.ToList().FirstOrDefault(c => c.RoomId == msg1.RoomId);
if (room != null)
{
room.Status = 1;
room.StatusChangedTime = DateTime.Now;
}
//发送信息给当前房间内的人
SendGameRoomMessage(room);
}
//处理房间踢人的操作
private void HandleGameRoomKick(ReceiveModel msg)
{
var msg1 = msg as GameRoomKickCommand;
var room = RoomList.ToList().FirstOrDefault(c => c.RoomId == msg1.RoomId);
if (room != null && room.Status !=2)
{
var list = room.List;
var needRemove = list.FirstOrDefault(c => c.UserId == msg1.UserId);
if (needRemove != null)
{
list.Remove(needRemove);
//如果当前是房主退出房间,房主替换成其他人, 房主客户端中断也算
if (needRemove.IsOwner && list.Any())
{
var newOwner = list.FirstOrDefault();
newOwner.IsOwner = true;
room.UserId = newOwner.UserId;
}
}
//房间没有产生记录且人数为0删除房间
if (!room.Saved && !list.Any())
{
RoomList.Remove(room);
}
//发送信息给当前房间内的人
SendGameRoomMessage(room);
var mine = Clients.FirstOrDefault(c => c.MemberId == msg1.UserId);
if (mine != null)
{
mine.RoomId = 0;
}
}
}
//处理房间内人loading进度
private void HandleGameRoomProcess(ReceiveModel msg)
{
var msg1 = msg as GameRoomProcessCommand;
var room = RoomList.ToList().FirstOrDefault(c => c.RoomId == msg1.RoomId);
var client = Clients.FirstOrDefault(c => c.MemberId == msg1.UserId);
if (room != null)
{
var list = room.List;
var player = list.FirstOrDefault(c => c.UserId == msg1.UserId);
if (player != null)
{
player.Process = msg1.Process;
}
var notReady = list.Any(c => c.Process < TOTAL_PROCESS);
var now = DateTime.Now;
var timespan = now - room.StatusChangedTime;
//超时时间1分钟所有人强制开始
if ((notReady && timespan.TotalSeconds > ROOM_TIME_OUT) || !notReady)
{
room.StartTime = now.AddSeconds(10).ToUniversalTime();
}
if (client != null)
{
client.RoomId = room.RoomId;
}
SendGameRoomMessage(room);
}
}
private string GameRoomMessageHandler(HostModel item)
{
//如果当前Client有请求房间列表信息发送房间列表信息
var G = "";
if (!string.IsNullOrEmpty(item.Request))
{
var param = item.Request.Split('/');
var pageInfo = param[0];
if (pageInfo.Equals("List"))
{
var pageIndex = Convert.ToInt32(param[1]);
var pageSize = Convert.ToInt32(param[2]);
var querName = param[3].ToString();
List<RoomModel> rooms;
if (!string.IsNullOrEmpty(querName))
{
rooms = RoomList.ToList().Where(c => c.Name.Contains(querName) || c.RoomId.ToString() == querName).OrderBy(c => c.Status).ThenByDescending(c => c.CreateTime).ToList();
}
else
{
rooms = RoomList.ToList().OrderBy(c => c.Status).ThenByDescending(c => c.CreateTime).ToList();
}
//计算总页数
int total = 0;
if (pageSize != 0)
{
total = rooms.Count() / pageSize;
total = rooms.Count() % pageSize == 0 ? total : total + 1;
}
G = $"{total}l";
rooms = rooms.Skip(pageIndex * pageSize).Take(pageSize).ToList();
foreach (var r in rooms)
{
string ss = "";
if (r.List != null && r.List.Count > 0)
{
ss = string.Join("|", r.List.Select(c => c.ToString()));
}
G += $"[{r.ToString()},detail{{{ss}}}]";
}
}
}
return G;
}
private void NotifyClient()
{
try
@ -772,7 +366,7 @@ namespace OnlineUserPool.ViewModels
m.WeightKg,
Competitionid = m.CompetitionId,
m.Saved,
m.FrameRate,
m.Frame,
}));
var data = Encoding.ASCII.GetBytes(jsonString);
item.Service.Send(data, data.Length, item.IPEndPoint);
@ -780,46 +374,13 @@ namespace OnlineUserPool.ViewModels
continue;
}
if (item.V == 1 && item.Service is UdpService)
{
sb.Clear();
foreach (var obj in list)
{
sb.Append(obj.ToString(1));
sb.Append("|");
}
var strV1 = sb.ToString();
var data1ForUdp = new NetworkData(strV1.Last() == '|' ? strV1.Substring(0, strV1.Length - 1) : strV1);
item.Service.Send(data1ForUdp.GetBytes(), data1ForUdp.GetBytes().Length, item.IPEndPoint);
data1ForUdp = null;
}
if(item.Service is TcpService)
{
NetworkData networkData = null;
if (item.V == 1)
{
sb.Clear();
foreach (var obj in list)
{
sb.Append(obj.ToString(1));
sb.Append("|");
}
var strV1 = sb.ToString();
var data1 = new NetworkData(strV1);
networkData = data1;
}
else if (item.V == 2)
if (item.V == 2)
{
networkData = HandleGzipNetworkData(list,item);
}
else
{
continue;
}
bool isZip = item.Encoding == "gzip";
item.Service.Send(networkData.GetBytes(isZip), networkData.GetBytes(isZip).Length, item.IPEndPoint);
@ -842,7 +403,7 @@ namespace OnlineUserPool.ViewModels
{
sb.Clear();
sb.Append("l{");
var runtimeList = list.Where(m => m.CompetitionId == item.Competitionid).Select(m => m.ToString(2)).ToList();
var runtimeList = list.Where(m => m.CompetitionId == item.Competitionid).Select(m => m.ToString()).ToList();
foreach (var obj in runtimeList)
{
sb.Append(obj);
@ -868,10 +429,10 @@ namespace OnlineUserPool.ViewModels
sb.Append("};e{");
var errorList = list.Where(c => c.RoomId > 0 || c.FrameRate > 0).ToList();
var errorList = list.Where(c => c.RoomId > 0 || c.Frame > 0).ToList();
foreach (var c in errorList)
{
sb.Append($"{c.MemberId},{c.RoomId},{c.FrameRate},{c.TotalTicks}");
sb.Append($"{c.MemberId},{c.RoomId},{c.Frame},{c.TotalTicks}");
sb.Append("|");
}
@ -887,29 +448,6 @@ namespace OnlineUserPool.ViewModels
return data2;
}
private void GameRoomDisConnectHandler(HostModel client)
{
////如果是在对战房间或者对战列表掉线执行,骑行阶段断开连接不移除房间信息
//if (client.Model != null && !client.Model.Equals("GameRoom"))
// return;
RoomList.ToList().ForEach(o => {
if (o.List != null && o.Status != 2)
{
var needRemove = o.List.FirstOrDefault(c => c.UserId == client.MemberId && c.Saved == false);
o.List.Remove(needRemove);
}
});
var needRemoveList = RoomList.ToList().Where(c => c.List.Count == 0 && c.Status != 2).ToList();
foreach (var item in needRemoveList)
{
RoomList.Remove(item);
}
BroadCastGameRoomList();
}
void WriteLine(string str)
{
//Debug.WriteLine(str);
@ -942,7 +480,6 @@ namespace OnlineUserPool.ViewModels
if (client != null)
{
RemoveClient(client);
GameRoomDisConnectHandler(client);
}
}
catch(Exception ex)