android - Python 等效于 Java DataInputStream.readUTF()

标签 android python sockets

我正在开发一个与基于 Python 的服务器通信的 Android 应用程序。我正在使用套接字进行通信。 Android 应用程序使用 DataOutputStream.writeUTF() 以 JSON 格式发送数据。发送数据代码如下

    DataOutputStream dataOutputStream = new DataOutputStream(
                   socket.getOutputStream());
    JSONObject jsonData=new JSONObject();
    jsonData.put("request", "signin");
    dataOutputStream.writeUTF(jsonData.toString());

我遇到的问题是 DataOutputStream.writeUTF() 在数据开头写入两个字节,这是发送数据的长度。为了在服务器端接收数据,我必须首先进行 2 次读取以获取数据长度,然后再进行两次读取以获取实际数据。 Python接收数据代码如下

    data = conn_stream.recv(2)
    data_length=struct.unpack('>H',data)[0]
    data=conn_stream.recv(data_length)

是否有与 Java DataInputStream.readUTF() 等效的 Python?

最佳答案

下面的 DataInputStream 类提供(几乎)Javas DataInputStream 中定义的所有方法,用于从输入流中读取原始 Java 数据类型,包括 readUTF() 方法。

"""
Reading from Java DataInputStream format.
"""

import struct

class DataInputStream:
    def __init__(self, stream):
        self.stream = stream

    def read_boolean(self):
        return struct.unpack('?', self.stream.read(1))[0]

    def read_byte(self):
        return struct.unpack('b', self.stream.read(1))[0]

    def read_unsigned_byte(self):
        return struct.unpack('B', self.stream.read(1))[0]

    def read_char(self):
        return chr(struct.unpack('>H', self.stream.read(2))[0])

    def read_double(self):
        return struct.unpack('>d', self.stream.read(8))[0]

    def read_float(self):
        return struct.unpack('>f', self.stream.read(4))[0]

    def read_short(self):
        return struct.unpack('>h', self.stream.read(2))[0]

    def read_unsigned_short(self):
        return struct.unpack('>H', self.stream.read(2))[0]

    def read_long(self):
        return struct.unpack('>q', self.stream.read(8))[0]

    def read_utf(self):
        utf_length = struct.unpack('>H', self.stream.read(2))[0]
        return self.stream.read(utf_length)

    def read_int(self):
        return struct.unpack('>i', self.stream.read(4))[0]

示例:

with open('/tmp/stream', 'rb') as f:
    dis = DataInputStream(f)
    val = dis.read_int()
    string = dis.read_utf()

注意:您应该注意到该类没有异常处理,并且它处理带有 NULL 字符的 UTF 字符串的方式可能不准确。

源代码来自 here .

关于android - Python 等效于 Java DataInputStream.readUTF(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29526121/

相关文章:

android - 使用 Espresso 和 RxJava 测试无限滚动 RecyclerView

python - 如何创建多个迭代

python - Pygame,RPG 游戏的高效碰撞处理?

c++ - Boost::asio socket - 如何在 'throw' 中创建 read_some "timeout"?

c++ - 当 ssh 工作正常时,为什么::connect() 返回 EHOSTUNREACH?

java - 如何使用 onclick()、使用按钮更改 TextView 的文本颜色?

android - 显式 Intent 广播接收器 - Action 过滤器行为

python - Twisted:如何知道何时收到所有数据?

Java-Client PHP-Server UDP打洞示例代码

java - 日期月份本地化