所以这是一个非常奇怪的问题。我有一个Java应用程序充当服务器,侦听并接受传入的客户端连接,然后从套接字读取数据(XML)。使用我的Java客户端驱动程序,一切都很好。我按预期收到消息。但是,仅在第一条消息上使用我的C ++客户端驱动程序,第一个字符被读取为ASCII 0(显示为小盒子)。我们在C ++中使用标准套接字API,发送一个char *(我们已经完成了char *,std :: string,只是引号中的文本)。
我使用Wireshark嗅探数据包,果然,它就在电线上。不可否认,我在客户端计算机上没有这样做。我的论点是它确实无关紧要,但如果这个假设不正确,请纠正我。
所以我的问题:到底是什么?为什么只有第一条消息包含这个额外的前置数据,但所有其他消息都没问题?是否有一些小工具让事情有效?
答案 0 :(得分:3)
这很可能是编码问题。如果你只是为你的C ++客户端使用char *,那么你假设是ASCII编码(充其量),而Java在内部使用Unicode(或UTF,我记错了),默认情况下会发出UTF-8(IIRC)。
让Java服务器发出7位/字符ASCII,或让您的C ++客户端读取Java正在发出的编码。
唉唉。我将不得不花费一些时间与谷歌蜷缩在壁炉旁找出如何匹配编码,但这确实给了我一些东西。我可能需要更改我的Java编码以匹配C ++使用的编码,因为这与客户场景相匹配。任何有良好链接,附加信息或代码段的人,请发布。
如果您已将XML打包为字符串,则可以使用getBytes()
进行编码:
byte [] asciiEncodedBytes = myString.getBytes("US-ASCII");
编辑:自从我进入Java领域已经有一段时间了,但看起来Java在核心库中没有任何ASCII编码流。我确实找到了this class,显然会为你包装一个ASCII编码流。值得庆幸的是,它位于open source project中,因此您可以从服务器中挖掘出类。
答案 1 :(得分:1)
不是我知道的。现在是时候二元搜索可能的罪魁祸首了。
我会在客户端计算机上运行Wireshark,以确保问题确实来自那里。从理论上讲,一些行为不端的路由器或其他东西可以做到这一点(很难相信)。
然后,我会在程序实际运行时使用调试器检查套接字API的参数。
此时,如果程序肯定是正确的,并且从计算机出来的数据包肯定是错误的,那么你正在看一个行为不端的网络库或坏的驱动程序。
答案 2 :(得分:0)
所以,编码的东西不起作用。最后,我只使用substring(startIndex)
作为起始索引对传入消息进行xmlMessage.indexOf("<")
调用。它可能不优雅,但它会起作用。盒子,仍将是一个谜。我很欣赏你们三人提供的见解。