在套接字上传输空字符的问题

时间:2009-02-21 11:29:08

标签: java c++ sockets tcp character-encoding

我正在编写一个小型Java服务器和一个C ++匹配客户端,它在STOMP protocol上实现了一个简单的IM服务。

该协议指定每个(在服务器和客户端之间传递的消息,如果愿意)必须以空字符结尾,在代码中我将其称为 {{1}无论是在Java还是在C ++中。

但是,当我通过套接字通过TCP传输帧时,任何一方都不会显示空字符。我正在使用UTF-8编码,并尝试切换到ASCII,没有帮助。

我做错了什么?

5 个答案:

答案 0 :(得分:2)

如果您使用ASCII或UTF-8编码文本,则将“字母”转换为字节流(字节编码)。您需要在消息字符串的末尾添加一个ZERO字节。

[猜测]您可能正在使用具有“WriteLine(String line)”之类的方法的高级库来通过网络发送数据。该方法的文档描述了实际发送的字节数,通常包括当前编码中的消息文本编码(ASCII,UTF-8等),后跟行终止序列,通常是字节13,10m或它们的组合('\ n','\ r \ n')。

使用低级Write()方法或WriteBytes()方法(取决于您的库)。将文本转换为ASCII或UTF-8,将零字节添加到结尾,并准确发送您要发送的内容。

答案 1 :(得分:1)

我建议下载Wireshark并监控传输,以查看问题是在发送端还是接收端。

答案 2 :(得分:0)

您要传输缓冲区还是字符串?如果传输字符串,则空字符将终止字符串,并且不会传输。使用缓冲区,您可以指定要传输的字节数,并包含空字符。

当然,问题可能出在传输和接收方面。

答案 3 :(得分:0)

您需要做的第一件事是使用Spencer建议的Wireshark(或类似的东西)。

如果这是发送方问题,请通过在代码中添加适当的诊断跟踪来仔细检查您是否正确编码了消息。

如果这是接收方问题,有没有办法在接收套接字上设置分隔符?可能有一个套接字选项,指示是包含还是排除分隔符。也许它正确传输,但接收套接字正在剥离它。

答案 4 :(得分:0)

您使用的是C ++?

新手错误是将NUL放在字符串的末尾:"Foo!\x00"

当然,写入字符串的ting将第一个NUL视为字符串的结尾,并且dos不传输它。您需要将nul 字符 '\x00'显式地作为一个字符(使用putChar或者c ++执行),而不是作为字符串的一部分。