从 android 客户端发送到 python 服务器时,最后一个字节会丢失

Last bytes are lost when sending from android client to python server

提问人:preno1221 提问时间:2/8/2023 更新时间:2/8/2023 访问量:40

问:

所以一切正常,除非我有非 ascii 的东西发送到 python 服务器(这是我的假设)。

基本上我发送了一个 json String,其中一部分是: ."Nova Nazaré - State of Mato Grosso, 78638-000, Brazil"

正如你所看到的,有一个字符,它不是标准的 ascii 字符。 所以正如我所说,我发送了 Json 字符串,并且由于 的存在,Json 字符串的最后一个 bracked 没有发送,数据已损坏。例如,如果我使用超过 1 个非 ASCII 字符,例如希伯来语,也会发生同样的事情。从字符串末尾丢失更多字节。'é''é'}

我想问我该如何解决这个问题......由于我使用的是 utf-8,而不是 ascii。所以我认为它应该有效。

这是我的 android 客户端的发送函数(它是我创建的 SocketTask 类的一部分):

private void send(String sendingStr)
    {
        try
        {
            OutputStreamWriter writer = new
                    OutputStreamWriter(this.socket.getOutputStream(),
                    StandardCharsets.UTF_8); // outputStreamWriter creating

            writer.write(sendingStr);
            writer.flush();

            Log.d("Result", "sent");
        }
        catch (Exception e)
        {
            Log.e("Exception", e.toString());
        }
    }

以下是我接收数据的方式:

    while True:

        client_socket, client_address_port = server_socket.accept()
        print(f"{client_address_port} connected.")

        length_to_read = client_socket.recv(HEADER_LENGTH).decode('utf-8')
        activity_name = client_socket.recv(int(length_to_read)).decode('utf-8')

        print("Got: " + length_to_read + activity_name)

        if activity_name:

            length_to_read = client_socket.recv(HEADER_LENGTH).decode('utf-8')
            data_string = client_socket.recv(int(length_to_read)).decode('utf-8')

            print("Got: " + length_to_read + data_string)

基本上,已经在 python 端的打印中,我看到存在服务器或其他东西未读取最后一个字节的错误。

还有想法?

python java android 接字 utf-8

评论

1赞 slothrop 2/8/2023
标头是否有可能以字符而不是字节为单位包含字符串的长度?然后,假设您的消息长度为 100 个字符,包含 1 个非 ASCII 字符:它的长度为 101 个字节,但如果标头声明长度为 100,则 Python 代码将只读取前 100 个字节而错过最后一个字节。
0赞 preno1221 2/8/2023
哦,伟大的天堂。这是一个精妙的观察 - 它实际上可能是错误的。我会马上更新。
0赞 preno1221 2/8/2023
这解决了!我真是太傻了。感谢!
0赞 skomisa 2/9/2023
@preno1221 考虑为您的问题创建并接受答案(包括解释)。一个被接受的答案的问题比埋在评论中的决议对 SO 社区更有帮助。
0赞 preno1221 2/11/2023
你是说我应该自己写答案?

答: 暂无答案