【问题标题】:How can I implement a good Client-Server approach?我怎样才能实现一个好的客户端-服务器方法?
【发布时间】:2012-02-05 20:50:12
【问题描述】:

我正在开发一个分布式应用程序,我需要将基于 Java 的客户端连接到基于 C++ 的服务器。他们两个都需要互相发送信息,但我需要他们能够在等待信息的同时做事,他们不知道什么时候会得到新的信息,或者发送信息。

我怎样才能做到这一点?现在我正在尝试使用 Sockets 实现基本的通信,但我并没有真正与它们进行通信。我读过使用套接字 + 线程通常是客户端-服务器应用程序的好方法。

能否请您推荐一些网络或书籍来阅读这方面的内容,或者给我一些示例代码来学习?

您认为我应该使用比套接字更好的其他方法吗?可能是更高级别的库(我需要它用于 c++ 和 java)或完全不同的方式?

编辑:

我会补充一些额外的信息。

我希望实现以下目标:

我的 C++ 程序有一个主循环,我想在其中进行类似 GetUpdatedDataFromRemoteDevice() 的调用,在其中我读取之前从网络(例如套接字)更新的一些数值变量的新值。

最终,C++ 程序需要向远程设备发送一条消息,告诉他发送其他类型的数据,然后继续获取更新的值。

从Java程序(远程设备)来看,运行的应用程序是一个交互式触摸屏,不会被网络传输阻塞,因为它必须继续为用户工作,所以所有的网络都应该在一个单独的线程中完成。

那个线程,应该连接到服务器,当一个按钮被按下时,开始循环发送数据(4个变化的数值),直到另一个事件发生。

如果能够轻松地重新连接到服务器,那就太好了。

【问题讨论】:

  • 网上有很多sockets教程资料,google一下。在我们给出详细答案之前,需要更多细节。您需要发送的数据量和频率是多少?你说他们互相发送信息——这总是由客户端发起的,还是你需要一个允许服务器将数据推送到客户端的连接?
  • 如果您正在寻找易于使用的消息传递,请查看:public.msli.com/lcs/muscle

标签: java c++ sockets client-server


【解决方案1】:

ICE 是一个现代且优秀的分布式应用程序库:

  • C++ 和 Java 等多种语言
  • 许多平台
  • GNU GPL
  • 性能不错
  • 易于使用

首先,您定义要在服务器和客户端之间交换的消息。
然后,您实现 C++ 和 Java 源代码来处理这些消息。

更多信息http://zeroc.com/ice.html
玩得开心;-)

编辑:我必须在某些项目中使用ACE。我可以看出 ACE 已经很老了,也许很成熟,但是使用了过时的 C++ 编码规则 :-( 因此 ACE 不像 STLBOOST 那样容易使用。此外,ACE 效率并不高……我更喜欢 ICE ;-)

【讨论】:

    【解决方案2】:

    我不知道您的应用程序是什么,但是要正确执行健壮的客户端服务器套接字编程是一项相当艰巨的任务。硬件字节顺序、字符串编码、网络错误、重试、重复消息、确认等。需要大量良好的设计和仔细的编程。在考虑使用多线程之前,您需要让它作为单线程运行良好。

    除非您需要从服务器到客户端的即时通知,否则我建议您使用 HTTP 作为客户端和服务器之间的协议。客户端可以偶尔轮询服务器以获取新消息。

    不管怎样,这个问题已经解决了很多次了。

    http://activemq.apache.org/

    http://www.rabbitmq.com/devtools.html

    http://www.cs.wustl.edu/~schmidt/ACE-overview.html

    【讨论】:

    • 还有:code.google.com/apis/protocolbuffers,用于跨语言一致的序列化。 Protobufs 非常可爱,因为它们以相应语言的适当样式生成 Java 和 C++ API,因此每种语言都会翻译一个消息格式规范。
    • 没错,protocolbuffers 非常适合有线编码,但它们不能解决通常更棘手的网络部分。
    • 同意。但是有线编码,即使它并不棘手,也绝对是一种痛苦——特别是如果你想要一个紧凑的编码。只是觉得值得一提。
    • 谢谢大家的回答,我会看看。
    【解决方案3】:

    我曾经做过这样的事情。就我而言,使用 JNI 将我的 C++ 应用程序连接到本地 Java 应用程序,然后让这两个 Java 应用程序相互通信更容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-28
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 2020-02-07
      • 1970-01-01
      • 2014-05-27
      相关资源
      最近更新 更多