From 8135da30223ea73740023cb1eb79e0e584fd6814 Mon Sep 17 00:00:00 2001 From: Timothy Liu Date: Sat, 29 Apr 2023 03:20:23 +0800 Subject: [PATCH] refactor(server): :recycle: make server base class to unify gameserver and playback server --- logic/Server/GameServer.cs | 21 ++++----- logic/Server/PlaybackServer.cs | 22 ++++----- logic/Server/Program.cs | 84 +++++++++++----------------------- logic/Server/RpcServices.cs | 15 ++---- logic/Server/ServerBase.cs | 14 ++++++ 5 files changed, 64 insertions(+), 92 deletions(-) create mode 100644 logic/Server/ServerBase.cs diff --git a/logic/Server/GameServer.cs b/logic/Server/GameServer.cs index 5d2724c..6573e7b 100644 --- a/logic/Server/GameServer.cs +++ b/logic/Server/GameServer.cs @@ -1,22 +1,17 @@ -using Grpc.Core; -using Protobuf; -using System.Threading; -using Timothy.FrameRateTask; -using System; -using System.Net.Http.Headers; +using GameClass.GameObj; using Gaming; -using GameClass.GameObj; -using Preparation.Utility; -using Playback; using Newtonsoft.Json; using Newtonsoft.Json.Linq; -using Preparation.Interface; +using Playback; +using Preparation.Utility; +using Protobuf; using System.Collections.Concurrent; +using Timothy.FrameRateTask; namespace Server { - public partial class GameServer : AvailableService.AvailableServiceBase + partial class GameServer : ServerBase { private ConcurrentDictionary semaDict = new(); // private object semaDictLock = new(); @@ -86,7 +81,7 @@ namespace Server } } - public void WaitForEnd() + public override void WaitForEnd() { this.endGameSem.Wait(); mwr?.Dispose(); @@ -202,7 +197,7 @@ namespace Server return false; } - public int[] GetScore() + public override int[] GetScore() { int[] score = new int[2]; // 0代表Student,1代表Tricker game.GameMap.GameObjLockDict[GameObjType.Character].EnterReadLock(); diff --git a/logic/Server/PlaybackServer.cs b/logic/Server/PlaybackServer.cs index 449c1ed..dc347ce 100644 --- a/logic/Server/PlaybackServer.cs +++ b/logic/Server/PlaybackServer.cs @@ -1,26 +1,23 @@ -using Protobuf; -using Playback; -using System; -using System.Threading; -using Timothy.FrameRateTask; -using Gaming; +using Gaming; using Grpc.Core; +using Playback; +using Protobuf; using System.Collections.Concurrent; +using Timothy.FrameRateTask; namespace Server { - class PlaybackServer : AvailableService.AvailableServiceBase + class PlaybackServer : ServerBase { protected readonly ArgumentOptions options; private int[,] teamScore; private ConcurrentDictionary semaDict = new(); - private object semaDictLock = new(); + // private object semaDictLock = new(); private MessageToClient? currentGameInfo = new(); private MessageOfObj currentMapMsg = new(); private uint spectatorMinPlayerID = 2023; - private List spectatorList = new List(); + // private List spectatorList = new List(); public int TeamCount => options.TeamCount; - private MessageWriter? mwr = null; private object spetatorJoinLock = new(); protected object spectatorLock = new object(); protected bool isSpectatorJoin = false; @@ -47,6 +44,7 @@ namespace Server return finalScore; } } + public override int[] GetScore() => FinalScore; public PlaybackServer(ArgumentOptions options) { this.options = options; @@ -57,6 +55,7 @@ namespace Server public override async Task AddPlayer(PlayerMsg request, IServerStreamWriter responseStream, ServerCallContext context) { + Console.WriteLine($"AddPlayer: {request.PlayerId}"); if (request.PlayerId >= spectatorMinPlayerID && options.NotAllowSpectator == false) { // 观战模式 @@ -95,6 +94,7 @@ namespace Server } catch { } Console.WriteLine($"The spectator {request.PlayerId} exited"); + return; } } catch (Exception) @@ -139,7 +139,7 @@ namespace Server } } - public void WaitForGame() + public override void WaitForEnd() { try { diff --git a/logic/Server/Program.cs b/logic/Server/Program.cs index c934cd1..1acffd6 100644 --- a/logic/Server/Program.cs +++ b/logic/Server/Program.cs @@ -1,15 +1,16 @@ -using Grpc.Core; +using CommandLine; +using Grpc.Core; using Protobuf; -using System.Threading; -using Timothy.FrameRateTask; -using System; -using System.Net.Http.Headers; -using CommandLine; namespace Server { public class Program { + static ServerBase CreateServer(ArgumentOptions options) + { + return options.Playback ? new PlaybackServer(options) : new GameServer(options); + } + static int Main(string[] args) { foreach (var arg in args) @@ -28,61 +29,30 @@ namespace Server Console.WriteLine("Server begins to run: " + options.ServerPort.ToString()); - if (options.Playback) + try { - try - { - PlaybackServer? playbackServer = new(options); - Grpc.Core.Server server = new Grpc.Core.Server(new[] { new ChannelOption(ChannelOptions.SoReuseport, 0) }) - { - Services = { AvailableService.BindService(playbackServer) }, - Ports = { new ServerPort(options.ServerIP, options.ServerPort, ServerCredentials.Insecure) } - }; - server.Start(); - - Console.WriteLine("Server begins to listen!"); - playbackServer.WaitForGame(); - Console.WriteLine("Server end!"); - server.ShutdownAsync().Wait(); - - Thread.Sleep(50); - Console.WriteLine(""); - Console.WriteLine("=================== Final Score ===================="); - Console.WriteLine($"Studnet: {playbackServer.FinalScore[0]}"); - Console.WriteLine($"Tricker: {playbackServer.FinalScore[1]}"); - } - catch (Exception ex) + var server = CreateServer(options); + Grpc.Core.Server rpcServer = new Grpc.Core.Server(new[] { new ChannelOption(ChannelOptions.SoReuseport, 0) }) { - Console.WriteLine(ex.ToString()); - } + Services = { AvailableService.BindService(server) }, + Ports = { new ServerPort(options.ServerIP, options.ServerPort, ServerCredentials.Insecure) } + }; + rpcServer.Start(); + + Console.WriteLine("Server begins to listen!"); + server.WaitForEnd(); + Console.WriteLine("Server end!"); + rpcServer.ShutdownAsync().Wait(); + + Thread.Sleep(50); + Console.WriteLine(""); + Console.WriteLine("=================== Final Score ===================="); + Console.WriteLine($"Studnet: {server.GetScore()[0]}"); + Console.WriteLine($"Tricker: {server.GetScore()[1]}"); } - else + catch (Exception ex) { - try - { - GameServer? gameServer = new(options); - Grpc.Core.Server server = new Grpc.Core.Server(new[] { new ChannelOption(ChannelOptions.SoReuseport, 0) }) - { - Services = { AvailableService.BindService(gameServer) }, - Ports = { new ServerPort(options.ServerIP, options.ServerPort, ServerCredentials.Insecure) } - }; - server.Start(); - - Console.WriteLine("Server begins to listen!"); - gameServer.WaitForEnd(); - Console.WriteLine("Server end!"); - server.ShutdownAsync().Wait(); - - Thread.Sleep(50); - Console.WriteLine(""); - Console.WriteLine("=================== Final Score ===================="); - Console.WriteLine($"Studnet: {gameServer.GetScore()[0]}"); - Console.WriteLine($"Tricker: {gameServer.GetScore()[1]}"); - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } + Console.WriteLine(ex.ToString()); } return 0; } diff --git a/logic/Server/RpcServices.cs b/logic/Server/RpcServices.cs index e65bacf..2db93b2 100644 --- a/logic/Server/RpcServices.cs +++ b/logic/Server/RpcServices.cs @@ -1,19 +1,12 @@ -using Grpc.Core; -using Protobuf; -using System.Threading; -using System; -using System.Net.Http.Headers; +using GameClass.GameObj; using Gaming; -using GameClass.GameObj; +using Grpc.Core; using Preparation.Utility; -using Playback; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Preparation.Interface; +using Protobuf; namespace Server { - public partial class GameServer : AvailableService.AvailableServiceBase + partial class GameServer : ServerBase { private int playerCountNow = 0; protected object spectatorLock = new object(); diff --git a/logic/Server/ServerBase.cs b/logic/Server/ServerBase.cs new file mode 100644 index 0000000..dbb578c --- /dev/null +++ b/logic/Server/ServerBase.cs @@ -0,0 +1,14 @@ +using Grpc.Core; +using Playback; +using Protobuf; +using System.Collections.Concurrent; +using Timothy.FrameRateTask; + +namespace Server +{ + abstract class ServerBase : AvailableService.AvailableServiceBase + { + public abstract void WaitForEnd(); + public abstract int[] GetScore(); + } +}