如何实现良好的客户端 - 服务器方法?

问题描述:

我正在开发一个分布式应用程序,我需要将基于客户端的Java连接到基于服务器C++的服务器上。他们都需要互相发送信息,但我需要他们能够在等待信息的同时做些事情,他们不知道他们何时会获得新信息或发送信息。如何实现良好的客户端 - 服务器方法?

我该如何做到这一点?现在我正在尝试与套接字进行基本的通信,但我实际上并没有进行沟通。我读过使用套接字+线程通常是客户端 - 服务器应用程序的好方法。

您能否推荐我一些网页或书籍来阅读这些信息,或者发送一些示例代码来学习?

你认为我应该使用其他方法,比插座更好吗?也许更高层次的库(我会需要它的C + +和Java)或完全不同的方式?

编辑:

我会添加一些额外的信息。

我很想实现如下:

我的C++程序有一个主循环,在这里我想有一个像GetUpdatedDataFromRemoteDevice()一个电话,我读到以前得到了更新一些数值变量的新值从网络(例如插座)。最终,C++程序需要向远程设备发送一条消息,告诉他发送其他类型的数据,然后继续获取更新后的值。

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

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

很容易重新连接到服务器也不错。

+0

网络上有很多插座教程资料,只是谷歌它。在我们能够给出详细的答案之前需要更多细节。你需要发送什么数量和频率的数据?你说他们互相发送信息 - 这是否始终由客户端发起,还是需要一个允许服务器将数据推送到客户端的连接? – DNA 2012-02-05 21:00:49

+0

如果您要查找简单易用的消息,请查看以下内容:https://public.msli.com/lcs/muscle/ – 2012-02-05 21:07:29

我不知道你的应用程序是什么,但健壮的客户端服务器套接字编程是相当多毛的任务来做正确的。硬件字节顺序,字符串编码,网络错误,重试,重复消息,acks等等。需要大量优秀的设计和仔细的编程。在使用多线程之前,你需要像单线程一样工作。

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

无论如何,这个问题已经被多次解决了。

http://activemq.apache.org/

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

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

+0

另请参阅:http://code.google.com/apis/protocolbuffers /,用于跨语言一致的序列化。 Protobufs真的很可爱,因为它们以适当的风格生成各种语言的Java和C++ API,因此每种语言都可以翻译单个消息格式规范。 – 2012-02-05 21:20:44

+0

确实,协议缓冲区对于编码编码来说很好,但它们并不能解决通常更棘手的网络部分。 – 2012-02-05 21:27:19

+0

同意。但是,Wire编码,即使它并不棘手,绝对是一个痛苦 - 尤其是如果你想要一个紧凑的编码。只是觉得值得一提。 – 2012-02-05 21:29:03

我做这种事一次。在我的情况下,使用JNI将我的C++应用程序连接到本地Java应用程序更容易,然后让这两个Java应用程序相互交谈。

ICE是分布式应用的现代化和良好的库:

  • 更多的语言C++和Java
  • 许多平台
  • GNU GPL
  • 不错的表现
  • 使用方便

首先,你定义你想要在服务器和客户端之间交换的消息。
然后,您将实现C++和Java源代码来处理这些消息。在http://zeroc.com/ice.html

更多信息好玩;-)

编辑:我在一些项目中使用ACE。我可以告诉ACE很老旧,也许成熟,但是使用过时的C++编码规则:-( 因此,ACE不如STLBOOST。此外,ACE并不是非常有效率......我更喜欢ICE ;-)