【问题标题】:How do I decode data from a TCP socket如何解码来自 TCP 套接字的数据
【发布时间】:2013-05-25 14:06:10
【问题描述】:

我正在尝试使用 python 制作的服务器和 java 中的客户端制作一个非常简单的聊天程序。但是我不知道如何解码服务器从客户端接收的数据。客户端发送并编码为 UTF-8。

只是打印它看起来像这样:http://i.imgur.com/0usK6j7.jpg

首先从 UTF-8 解码看起来像这样:http://i.imgur.com/Ctwivl4.jpg

我假设 NUL 字符或 \x00 可以被删除。包装整个消息的 b'' 也是如此。第二个字符似乎指定了消息的长度。但是我该如何解码呢?我应该手动删除字符吗?我知道这是一个非常基本的问题,可能以前有人问过,但我什至不知道要搜索什么。

【问题讨论】:

  • 我不确定你的意思。我正在通过 TCP 连接发送 UTF-8 编码的消息。还有什么我正在做或应该注意的事情吗?
  • 为了回应@ejno 所说的,看起来您正在使用某种结构化的二进制数据编码,不是简单的 UTF-8 文本。从您提供的示例中,至少可以看到一些以 16 位长度开头的文本字符串。一般来说,要“从 TCP 套接字解码数据”(或其他任何东西),您需要遵循您希望数据采用的任何格式的规范。
  • 在 java 客户端我有一个 DataOutputStream 对象,我使用这个方法:out.writeUTF(input);
  • 嗯,很明显,根据the documentation of that method,它不会将 UTF-8 写入输出流。它说“首先,将两个字节写入输出流”,这解释了字符串之前的 16 位长度。甚至在这之后它不再编写 UTF-8,而是使用 Java 自己的特殊编码编写,它称为 Modified UTF-8,它实际上是 CESU-8 的变体,而不是 UTF-8。
  • 首先,您需要明确您希望使用什么格式在客户端和服务器之间进行通信:协议。是纯 UTF-8 吗?是writeUTF 发出的奇怪的结构化编码吗?是别的吗?然后编写您的客户端和服务器以遵循该规范。

标签: java python sockets tcp chat


【解决方案1】:

在 java 客户端我有一个 DataOutputStream 对象,我使用这个方法:out.writeUTF(input);

根据documentation of that method,它不会将UTF-8 写入输出流。它说“首先,将两个字节写入输出流”,这解释了字符串之前的 16 位长度。甚至在此之后它不再编写 UTF-8,而是使用 Java 自己的特殊编码编写,它称为 Modified UTF-8,它实际上是 CESU-8 的变体,而不是 UTF-8。

首先,您需要明确您希望使用什么格式在客户端和服务器之间进行通信:协议。是纯 UTF-8 吗?是writeUTF 发出的奇怪的结构化编码吗?是别的吗?然后编写您的客户端和服务器以遵循该规范。

【讨论】:

    猜你喜欢
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多