【问题标题】:Sending both a String and a Byte[] from Android app to Python Server over Sockets通过套接字将字符串和字节 [] 从 Android 应用程序发送到 Python 服务器
【发布时间】:2020-01-28 15:29:03
【问题描述】:

我正在从一个 android 应用程序中以字节数组的形式发送一个图像。我以前能够分部分发送数组,然后将这些部分放入 python 中的列表中,但这会产生一些错误,因为 python 会使用 b' 预先加载每个部分,而这些部分将保留为字符串的一部分。所以我现在正在尝试发送整个字节数组。在我发送数组之前,我发送了一个字符串,它给出了字节数组的大小,这样我就可以调用 call .recv 以获得正确的大小。

bytes_len = int(clean_len(str(connection.recv(1024))))

clean_len 只是取出 '\'' 和 'b'

然后我使用 data = connection.recv(int(bytes_len) 但它将数据输出为

Waiting on connection...
---------------------------------------------
Connection Accepted
Connection received from... ('192.168.1.89', 41568)
BYTES_LEN_RECV:  9640320 
METADATA_RECV:  m240,second_attempt,requalify,4,4,4
BYTE_ARRAY_RECV:  b'' #THIS IS THE ISSUE
Sending Response
Closing Connection to  ('192.168.1.89', 41568)

我正在从应用程序发送这样的字符串,紧随其后的是字节数组

printWriter.write(String.valueOf(bytes.length));
printWriter.flush();
printWriter.write(metadata);
printWriter.flush();
printWriter.close();

BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());
bufferedOutputStream.write(bytes,0,bytes.length);
bufferedOutputStream.flush();
bufferedOutputStream.close();
socket.close();

你能不发送那么长的字节数组吗?还是我错过了一些关键的未知步骤?

【问题讨论】:

  • 我会在任何处理完成之前检查原始数据,即在clean_len之前。我还认为第一个 recv 正在读取缓冲区,所以当第二个 recv 被调用时,所有内容都已被读取,这会产生一个空数组。
  • 哦,我假设每个 .recv 对应于应用程序中对 .flush 的每个调用。我对元数据和大小使用了两次调用,如下所示``` bytes_len = int(clean_len(str(connection.recv(1024)))) metadata = clean_len(str(connection.recv(1024))) ```
  • 试试看,如果是这个问题,请告诉我。

标签: java python android sockets networking


【解决方案1】:

不要多次读取套接字。重构代码,以便您首先从缓冲区中获取原始字节,然后以您喜欢的任何方式处理这些字节。

data = connection.recv(1024)
data = clean_data(data)
...

【讨论】:

  • 更改了它,以便之后进行处理并且没有更改。为了使协议清晰,它会调用 .recv(1024) 以获取字节数组的长度 另一次调用 .recv(1024) 以获取一些元数据(也是字符串),然后最终调用 .recv(length ) 获取字节数组前两个调用工作正常,它只是字节数组部分
  • 我认为您想重构您的通信,因为您似乎认为您正在控制通过调用flush 发送的信息。将套接字视为恒定的字节流,您不能像现在这样依赖flush。有多种方法可以做到这一点。一些想法:1)在接收方解析数据2)使消息的长度恒定(通过​​填充)并通过读取先前已知的大小来接收。 3) 发送 JSON 数组 {"metadata": "", "data": ""} 并检查服务器,直到收到完整的 JSON 数组,然后 json.loads
  • 好吧,我改变了它,所以我发送一个 JSON 对象而不是发送字符串的两个调用,但是字节数组仍然是空的。
  • 感谢您的帮助,我最终只是将 Bytes 数组转换为字符串对象,并以与元数据类似的方式发送它,现在它全部作为一个整体发送。感谢您的帮助!
猜你喜欢
  • 2021-04-29
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多