【问题标题】:client server c++ serialization客户端服务器C++序列化
【发布时间】:2015-12-09 04:33:45
【问题描述】:

我正在使用 c++ 为客户端和服务器编写一些代码。

我正在使用 boost serialize 在客户端序列化一个对象,然后将其发送到服务器。 然后服务器反序列化流并重新创建对象。 服务器然后调用对象的运行函数。 然后服务器序列化对象并将其发送回客户端。

我这样做的原因是例如客户端需要知道服务器上的 /home/dataIncoming 文件夹中有哪些文件。

这只是一个简单的例子

我的问题是,对于序列化的对象,我需要在服务器和客户端上使用相同的代码。或者服务器如何知道如何反序列化发送的对象。

因此,如果我更改服务器代码,我需要确保我也将代码传递给客户端程序。

  1. 程序员如何轻松解决客户端和服务器重复代码的问题?

  2. 或者有什么方法可以序列化,这样重复的代码就不需要存在于客户端和服务器上?

  3. 或者我只是简单地向服务器发送一个协议流,并让服务器读取该协议流以重构要运行的命令和要发回的信息。

在客户端构建一个对象,让它在服务器上运行,然后将结果发送回客户端似乎是最简单的。

感谢您的所有想法!

【问题讨论】:

  • 您的客户端和服务器都必须知道对象类型。把它放在一个被编译到两个程序中的组件中。 (我想它们都是用 C++ 编写的)。
  • 你可能想看看 RPC

标签: c++ sockets server


【解决方案1】:

对于通用客户端服务器操作:

  1. 您将代码编译到库中,并在客户端和服务器上使用该库。

  2. 您的客户端和服务器都需要了解数据格式。没有办法解决这个问题。

  3. 您可以有一个更抽象的层,允许客户端提交新数据类型的格式,但这个抽象层本身需要是客户端和服务器都能理解的数据格式。

我不清楚您的示例与通用案例有何不同(完全不同)。

【讨论】:

  • 谢谢通用解决方案是我正在寻找的。自学并不总能让我深入了解通用答案。
【解决方案2】:

客户端和服务器必须共享数据(和数据格式),但不是代码。

听起来你的对象封装了三样东西:

  1. 数据
  2. 一些客户端代码
  3. 一些服务器代码

许多面向对象的编程都鼓励将数据和对其进行操作的代码放入同一个对象中,但这并不总是最好的解决方案。为什么不把这些东西分开呢?

将您的数据放入数据对象并对其进行序列化。服务器将拥有对该数据进行操作的某些东西(可能是某个对象,但不一定),而客户端将拥有对该数据进行操作的某些东西。所以,我认为你只需要重新考虑你的程序的结构。

您描述的架构还有另一个缺点。如果要修改服务器的行为,还必须更新客户端。如果这些问题是分开的,这将不是问题。您必须同时更新客户端和服务器的唯一原因是数据格式是否发生变化。

【讨论】:

    【解决方案3】:

    通常,编码和解码由您使用的序列化库负责。 (谷歌 prorpbuf、nano-pb、boost 等) 然而,由于类/结构的编码和解码基本上是相同的。

    所以本质上我们在两端(服务器和客户端)需要相同的信息 一个好主意是为此功能模块创建一个 dll 或 .so,当更改时可以在服务器和客户端上反映出来,而无需重新编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多