【发布时间】: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