2014-02-20 140 views
2

我正在研究一个涉及几台计算机上的几个应用程序的项目。主应用程序是在CentOS服务器上运行的C++套接字服务器,客户端应用程序是在客户端PC上运行的Java程序。套接字通信协议/标准

这些将使用套接字来回传递。我已经定义了一组命令和参数,它们将需要实现以支持所有内容。

我已经考虑了几种选择,但我似乎无法找到完美的..

  • 应在C++和Java程序编写自己的类别/验证消息的解析器?
  • 我应该创建一个定义所有通信消息的XML文件(通过HTTP提供服务)吗? (这在服务器/客户端将解析和创造行动)
  • 或者使用某种类型的第三方库(谷歌协议缓冲?)

的一点是,当套接字服务器发送消息X,然后客户必须知道如何处理它。其他方向也一样。

什么是最好的实施方式?拥有XML文件会很好,因为客户端/服务器可能会解析它并根据数据创建方法/操作。但更清晰的方法是创建可以解析的类。

+0

为什么XML而不是JSON?另外,如果您想轻松调试您的协议,最好使用基于文本的协议;但最终这是你的选择。 – fge

+0

消息是基于文本的。 – DavidS

+0

是的,但我在谈论一般的协议(什么包装消息等) – fge

回答

0

我总是这样做的二进制方式。首先,您必须决定使用什么底层传输协议,可能是UDP,TCP,TCS,SSL。我将从TCP开始,因为它非常稳定且易于使用。

处理包的一种简单方法是在每个包中以一个数字开头,该数字指定这是哪个包。根据此编号,将包发送到处理数据的相应类。这可以在C++和Java中轻松完成。我认为在C++中它比较容易,因为在那里你可以根据他的第一个数字来读取整个结构,但是在Java中你通常必须通过基元来读取它。

请记住,互联网上的标准是使用big-endian值,但现今大多数机器(Intel,AMD,ARM ...)的正常使用little-endian值。所以在C++中,你必须在发送它们之前翻转所有的基元。而且你还必须翻转收到的值。我不知道Java是否会为你做...

+1

你不必使用TCP的大端,你可以轻松使用小端。 –

0

ICE by ZeroC是一个跨平台和跨语言库,用于C++和Java之间的TCP/IP通信。我已经使用ICE在用于C++/Java程序的Linux/AIX/Solaris之间进行通信,没有任何问题。 ICE使用二进制传输协议,为您进行大端/小端转换。 ICE的缺点是您需要使用自定义语言来定义消息和调用。