在客户端和服务器之间共享代码,以消除彼此之间的依赖关系

本文关键字:彼此之间 关系 依赖 客户端 服务器 之间 代码 共享 | 更新日期: 2023-09-27 18:00:00

我正在用C#和XNA开发一款多人游戏,该游戏由客户端和服务器项目组成。大部分代码都是在客户端项目中构建的(服务器端验证仍在进行中)正因为如此,服务器可执行文件在运行时要求客户端位于同一目录中。(这不是一个大问题,但对应用程序来说有点罕见)这是因为服务器(GameName.Server)引用了GameName.Client命名空间,它在另一个项目中。

我认为合乎逻辑的想法是将代码分为三部分:

  1. 客户端(使用"共享"项目的呈现和客户端特定代码)
  2. 服务器(利用"共享"项目的服务器端逻辑)
  3. 共享/通用代码(例如:消息类型、块类型、实体类)

目前(我对问题的长度不感兴趣),我的(简化的)结构布局是这样的:

├───Client
│   ├───Entities
│   ├──────Player.cs
│   ├───Interface
│   ├──────Window.cs
│   ├───Networking
│   ├──────MessageHandler.cs
│   ├──────MessageType.cs
│   ├──────LoginPacket.cs
│   ├───World
│   ├──────Map.cs
│   ├──────TileTypes.cs
├───Server
│   ├───MessageHandler.cs
│   ├───Program.cs
│   ├───Other Server Stuff, etc etc

服务器需要能够在内部运行Map,其中包含播放器和发送给客户端的块阵列。正如您所看到的,它的代码中不包含映射,而是在客户端项目中。

本例中的Map还包含在客户端上绘制地图的渲染代码(服务器没有使用这些方法,但它仍然使用相同的Map类)


我已经开始创建一个客户端和服务器都可以使用的"共享"类库。许多东西,如消息类型、简单枚举、块属性等,都很容易在项目之间共享。

我的问题涉及到MapPlayer类。它们都包含诸如(在地图的情况下)玩家列表之类的属性。玩家列表可以在客户端和服务器端共享。然而,像小地图这样的东西呢?服务器实际上不需要有一个极小值映射,或者只需要在客户端上显示地图的渲染代码。

我该如何进行这样的分班?我的想法是用一个接口或抽象类来处理基础(例如:玩家列表、当前状态、玩家位置),并让服务器和客户端根据需要实现自己的代码。(例如:客户端将实现绘制地图的方法,服务器可以实现查找发送消息所需的玩家ID的方法)

我的问题是:我如何才能有效地将代码从客户端和服务器中分离出来,这样我只需要写一次,就可以实现两者的自定义功能,而不需要相互依赖?

如果你想更好地了解它,我应该提到这个项目是开源的。

在客户端和服务器之间共享代码,以消除彼此之间的依赖关系

如果我正确理解你的问题,那么你似乎正在沿着正确的道路创建共享资源库,并寻求继承来解决你的问题。如果像Map或Player这样的类实际上在客户端和服务器实现中都具有通用功能,那么抽象类似乎是正确的做法。我知道我有一些项目具有这种共享功能,我们通过这种方式来完成。