【问题标题】:Client Server API interaction客户端服务器 API 交互
【发布时间】:2015-12-25 03:11:09
【问题描述】:

我正在编写一个客户端服务器程序,我的想法是让服务器尽可能简单。服务器将需要完成诸如“移动此文件”、“删除文件”之类的任务,对文件中的列运行此复杂算法并发回结果。

我创建了一个抽象类,它将在服务器和客户端之间发送,称为 aTodo 在这个抽象类中有一个称为 DoClass() 的方法将由服务器运行。

目前我的服务器正在侦听并等待连接。当它接收到一个连接时,它会通过反序列化创建一个 aTodo 类型的对象。然后服务器在该对象中运行 DoClass 函数。然后服务器序列化对象并将其发送回客户端。 以下是参考代码:

protocolBaseServer pBase(newSockFd); //create socket
std::unique_ptr<aTodo> DoThis; //create object variable
DoThis=protocolCom::Read<aTodo>(pBase); //read the stream into the variable

DoThis->DoClass();//call the do function in the 
protocolCom::Write(DoThis,pBase);//write back to the client

这是对服务器进行编程的好方法吗?在服务器上非常简单。

我想的另一种方法是创建一个可以序列化并来回发送的委托类。委托将有一个 DoDelegate 方法。然后用户可以将任何函数放入委托的 DoDelegate 方法中。这将影响允许服务器运行类中的任何方法,而不仅仅是我现在运行服务器的 Single DoClass 方法。

谢谢

【问题讨论】:

  • 在没有 SSCCE 的情况下,我们无法提供具体的反馈。也许你不是在寻找那个,这就是我提供答案的原因。

标签: c++ sockets boost server client


【解决方案1】:

这是一种很好的梦想......

您将如何序列化通用委托?这不是 C++ 所促进的……

此外,此时您的客户端必须包含服务器实现的所有逻辑。因为您实际上是通过序列化发送服务器类。

我认为您需要将命令对象和实现相应操作的处理程序分开。

另外,我建议服务器将接收到的命令排队,并由单独的工作人员处理来自队列的命令。

解决这个问题的常用方法是使用异步套接字 io 的框架,例如 ACE 或 Asio。

【讨论】:

  • 喜欢“DeleteFileCommand”和“DeleteFileCommandHandler”?我的意思是,我会不使用继承层次结构,但如果这会让你的船浮起来......
  • 我认为这个想法在概念上没有任何问题。我的意思是,我们有瘦客户端,为什么没有瘦服务器呢?当然,C++ 根本不能用于此 - 因为任何解决方案都需要发送实际的 CODE 以供执行。 Butr 在支持这一点的语言上,这可能是一个不错的设计。
  • 是的。好吧,我们不是在讨论梦境(此外,梦境会充满安全漏洞和配置管理问题)。在当前情况下,明显的问题是维护成本,其中对客户端或服务器代码的任何修复都需要重新编译、重新部署和重新启动所有客户端。
  • 通常在编码服务器客户端应用程序时如此。你如何告诉服务器“去列出 /home/foo 中的目录”并将列表发回给我?网上很多例子都是简单的回显服务器。我将如何完成我想做的事情?
  • 我相信开发一个接口类对我来说可能更聪明。然后服务器可以读取这个接口类,然后确定客户端想要它做什么?
猜你喜欢
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 2015-08-14
  • 2015-01-02
  • 2014-10-06
  • 2017-12-06
  • 2013-10-27
  • 2020-07-19
相关资源
最近更新 更多