套接字通信协议/标准

时间:2014-02-20 13:43:14

标签: java c++ sockets

我正在开发一个涉及多台计算机上的多个应用程序的项目。主要应用程序是在CentOS服务器上运行的C ++套接字服务器,客户端应用程序是在客户端PC上运行的Java程序。

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

我想过几个选项,但我似乎无法找到完美的选择..

  • C ++和Java程序是否应该编写自己的类/解析器来验证消息?
  • 我应该创建一个定义所有通信消息的XML文件(通过HTTP提供)吗? (服务器/客户端将解析并创建操作)
  • 或使用某种第三方库(Google Protocol Buffers?)

关键是当Socket服务器发送消息X时,客户端必须知道如何处理它。同样适用于另一个方向。

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

2 个答案:

答案 0 :(得分:0)

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

处理包的一种简单方法是在每个包中以一个数字开头,该数字指定了这个包。基于此数字,您将包发送到处理数据的相应类。这可以在C ++和Java中轻松完成。我认为在C ++中它更容易,因为在那里你可以不在第一个数字读取整个结构中,但在Java中你通常必须用原语来读它。

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

答案 1 :(得分:0)

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