如何从TCP套接字解码数据

3
我正试图制作一个非常简单的聊天程序,服务器用Python编写,客户端用Java。然而,我不知道如何解码服务器从客户端接收到的数据。客户端发送并编码为UTF-8。
仅仅打印出来看起来像这样:http://i.imgur.com/0usK6j7.jpg 从UTF-8解码后,它看起来像这样:http://i.imgur.com/Ctwivl4.jpg 我猜NUL字符或\x00可以被删除。同样的情况也适用于包裹整个消息的b''。第二个字符似乎指定了消息的长度。但是我该如何解码呢?我应该手动删除字符吗?我知道这是一个相当基本的问题,可能已经被问过,但是我不知道该搜索什么。

我不确定你的意思。我正在通过TCP连接发送UTF-8编码的消息。除此之外,我还需要注意什么吗? - Latedi
2
回应 @ejno 所说的,看起来你正在使用某种结构化二进制数据编码,而不仅仅是UTF-8文本。从你提供的样本中,可以看到至少有一些文本字符串前面带有16位长度。通常,要“从TCP套接字解码数据”(或从其他任何地方),您需要遵循您期望数据格式的规范。 - Celada
在Java客户端中,我有一个DataOutputStream对象,我使用它来调用这个方法:out.writeUTF(input); - Latedi
2
显然,根据该方法的文档,它不会将UTF-8写入输出流。它说“首先,两个字节被写入输出流”,这解释了在字符串之前出现的16位长度。即使在此之后,它也不会写入UTF-8,而是使用Java自己的特殊编码方式,称为Modified UTF-8,实际上是CESU-8的变体,而不是UTF-8。 - Celada
1
首先,您需要澄清您希望在客户端和服务器之间使用哪种格式进行通信:协议。它是纯的UTF-8吗?还是writeUTF发出的奇怪结构化编码?还是其他什么?然后编写您的客户端和服务器以遵循该规范。 - Celada
显示剩余3条评论
1个回答

3
在Java客户端中,我有一个DataOutputStream对象,我使用以下方法:out.writeUTF(input)。
根据该方法的文档,它不会将UTF-8写入输出流。它说:“首先,两个字节被写入输出流”,这解释了您前面出现的16位长度。即使在此之后,它也不会写入UTF-8,而是使用Java自己的特殊编码方式,称为“Modified UTF-8”,实际上是CESU-8的变体,而不是UTF-8。
因此,首先,您需要澄清您希望在客户端和服务器之间使用哪种格式进行通信:协议。是纯UTF-8吗?是writeUTF发出的奇怪结构化编码吗?还是其他什么?然后编写您的客户端和服务器以遵循该规范。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接