0

我是一名初学者程序员,他试图将对象列表存储在服务器上,并且客户端可以连接并查看/编辑此列表。

我会尽力解释我的设置是什么。

服务器:这将包含一个“主列表”,其中包含该列表类型的所有对象。当客户端想要更新时,需要将此列表传递给客户端,以便他们可以读取它。

客户端:客户端将从服务器读取更新的列表,当他们对列表进行更改时,需要将此更改发送到服务器。

现在我在想我做到了只有 1 个客户可以随时编辑列表,并且由于可以添加/删除/更改/更改列表中的位置,我认为最好让客户发送他们的列表到服务器以替换服务器。这样,由于只有 1 人将编辑列表,因此列表应保持更新。

我的问题是我找不到通过网络发送对象列表的简单方法。目前,我可能可以通过一次将一个对象转换为 XML 来实现它,但因为它是一个需要大量代码的列表。我希望有人知道通过网络移动对象列表或将对象列表再次转换为字符串/返回的更简单方法。

我正在做的一个简单的例子是想象一个人们可以点击和移动的字段上的图片,所以我需要跟踪图像的顺序、x/y 和图像名称。这是一个粗略的例子。

请让我知道您的想法,任何帮助将不胜感激。我是初学者,所以对于任何不正确的术语,我深表歉意。

谢谢你。

4

2 回答 2

1

文本协议

  • XML
  • JSON
  • HTML/SOAP

XML 工作得很好,尤其是在您刚刚学习的时候。它很简单,而且你已经有足够的知识来学习,而不必担心此时的效率。网络是个大课题!

JSON 比 XML 稍微简洁一些,并且具有同等的可读性。我认为 C# 没有内置 JSON 序列化,因此您需要第三方库。

一个网络服务会很容易。交换的信息会更多,但这将更具可扩展性,因为 Web 服务器已经非常优化。但是,我不建议创建一个简单的 Web 服务,因为它教你的东西比直接使用套接字要少。

二进制协议

  • 内置序列化
  • 第三方(Protobuf 或 Thrift)
  • 手动序列化

如果需要快速发送/接收数据,或者您想要一个更具可扩展性的服务器,我建议使用二进制协议。二进制协议很小,难以阅读。

如果所有客户端和服务器都基于 C#,则只需使用内置的序列化 C# 提供。它比其他序列化解决方案更冗长,但它是最简单的解决方案。同样,正如您正在学习的那样,如果您需要二进制协议,我建议使用内置序列化。

如果不是所有的客户端和服务器都是基于 C# 的,请使用像 Google Protobufs 或 Apache Thrift 这样的库,它提供了一种非常容易且非常有效地以不同语言序列化二进制协议中的对象的方法。

最后的解决方案是手动序列化。这将是非常快速但不灵活、困难、乏味且难以维护的。我不建议这样做。

于 2013-08-18T19:40:41.570 回答
0

不要来回发送整个列表。仅发送更新。

服务器应该保存已编译的列表,并且还应该保存从上次整个列表为“快照”时的所有更改的列表。

更新是:

  • 删除
  • 编辑
  • 补充

如果您没有太多数据,则可以对所有内容使用简单的 xml。

收到后,每个更新都应从服务器获取序列号。这样每个客户端都知道最后的更新号,并且可以通过轮询请求新的更新(如果可用)。

连接后,客户端应:

  • 从服务器请求快照(接收最后一个 ID 快照)

稍后,客户应该:

  • 定期轮询新的更新并将更新存储在本地列表中

在客户发生任何变化时,客户应:

  • 打包更改并将其发送到服务器

实现这一点既具有挑战性又很有趣。并且肯定会在这里提出更多问题:)

于 2013-08-18T20:05:45.317 回答