【问题标题】:Networking between Java Socket client and C++ (Boost based) serverJava Socket 客户端和 C++(基于 Boost)服务器之间的网络连接
【发布时间】:2011-08-11 16:53:25
【问题描述】:

在工作中,我正在设计一个用于控制机器人组的用户界面。机器人使用 UDP 广播来管理彼此的动作。

GUI 需要能够与机器人通信。为此,运行中间服务器。所有机器人都监听它(使用 UDP 传感器),所有运行的 GUI 都连接到它(通过 TCP)。它管理 GUI 机器人通信。

但是,服务器是用 C++ Boost 库编写的,而 GUI 是用 Java 编写的,并且出现了一些网络问题。我很容易通过套接字连接到服务器:

try {
    socket = new Socket(targetAddress, targetPort);
} catch (IOException e) { e.printStackTrace(); }

服务器注册连接,一切正常。

但是,当我尝试发送字符串时:

try {
    stream.writeUTF(message);
    stream.flush();
} catch (IOException e) { e.printStackTrace(); }

注意:我最初使用 PrintWriter 一次发送一个字符串 (println()),但切换到 DataOutputStream 以查看它是否有帮助。

我们遇到了问题。 Boost 甚至没有注册我发送的消息,即使 Java 成功了。此外,当从服务器发送字符串时,它们的格式无法识别。

对这个问题的一点调查表明,Boost 会自动将“标题”文本附加到它发送的所有消息中,帮助它归档收到的消息。由于 Java 不这样做,看来这可能是原因。它是否正确?如果是这样,我们怎样才能绕过它?


几点说明:

  • 由于时间限制,大规模切换到不同的库/语言并不是一个真正的选择。但是,如果有一个 C++ TCP 库可以让服务器接收我发送的消息,并且我们可以轻松集成它,那将是完美
  • Java 网络代码在连接到 Java 服务器时可以完美运行。困难似乎发生在 Boost-Java 接口中。
  • 不幸的是,我本人或从事该项目这方面工作的其他人都没有网络经验。 :( 我的经验是 Java 和 GUI 开发,另一个人是 AI 程序员/硬件专家。我们非常欢迎任何有关此问题的帮助。

【问题讨论】:

  • 您使用什么协议来构建这些消息?
  • 什么意思?我们现在只是测试直接发送字符串数据。上面列出了 Java 代码的核心。 Boost 代码基于 Boost Asio TCP Synchronous 示例。
  • TCP 是字节流。我在问接收器应该期待多少字节?有标题吗?有哨兵值吗?
  • Java 使用 UTF-16 编码字符串(LE 或 BE,我不确定。)默认情况下,C++ 使用 ASCII 字符串,但可以很容易地使用“宽”字符串,这取决于您的操作系统/编译器,但可以是 UTF16LE、UTF16BE 或 UTF32。这可能是服务器消息乱码的原因。 如果你的 Java 机器和 C++ 服务器都是 LE 或都是 BE,而 C++ 服务器是 Windows/MSVC,那么只需使用 wchar_t/wstring。
  • 此外,boost 不应添加标准 TCPIP 标头以外的标头。根据en.wikipedia.org/wiki/… 的说法,标准的 tcp 标头可以达到 480 字节。

标签: java c++ networking boost tcp


【解决方案1】:

从发送和接收第一个字节开始,然后是整数。请注意大小(例如 C++ 中的 64 位整数)和字节顺序(最小与最重要的优先)。正如 Sam Miller 所提到的,您需要创建自己的协议,该协议将定义您可以发送什么样的消息以及它们的元素如何排序。

可能发生的情况是 Boost 首先发送字符串的长度。请阅读使用 Boost 库发送的消息的有线格式以及 DataOutputStream 使用的有线格式。

【讨论】:

    【解决方案2】:

    首先,您需要知道 Boost 使用哪种编码、字节顺序和包格式来确定命令的开始和结束。 例如,命令可能类似于 WALK,但您根本不会通过连接发送 WALK 字符串。 它可以使用像 \n 这样的分隔符,因此您可以发送:WALK\n 另一件事是要知道它使用的是什么编码,您可以使用字符串方法 myString.getBytes("UTF-8");使用套接字的输出流通过网络以 UTF-8 格式发送 byte[]。

    【讨论】:

      猜你喜欢
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多