【问题标题】:Python Sockets bytes decoding from Java client来自 Java 客户端的 Python Sockets 字节解码
【发布时间】:2021-02-07 21:27:13
【问题描述】:

从我的客户端,我正在向服务器发送一个变量大小的整数,当我在服务器上得到它时,它的数据格式与我需要的不同,我该如何解码它?

发送时的客户端代码

Socket s = new Socket();
s.connect(new InetSocketAddress(voids[1], 7800), 2000);
DataOutputStream writer = new DataOutputStream(s.getOutputStream());
data.remove("ObjectStream");
writer.write(9); // used 9 for testing
writer.flush();

用于接收的服务器端

amt = client.recv(self.SIZE) # size is 1024
amt = amt.decode() # where it should have decode and get 9

在服务器端接收到值的整数值:

  • 1 -> b'\01'
  • 2 -> b'\02'
  • 3 -> b'\03'
  • 8 -> b'\08'
  • 9 -> b'\t'
  • 10 -> b'\n'

【问题讨论】:

  • A DataOutputStream 使用非常特定的序列化协议(类似于 XDR)。您确定不想使用普通的OutputStream。但是,您显示的输出不会仅由该代码产生。请提供minimal reproducible example
  • DataOutputStream 上仅调用write(9) 只会产生字节9,仅此而已。所以要么这不是java.io.DataOutputStream,要么你在write(9) 之前和之后写了更多的数据。您可能还想指定您实际期望的结果。
  • 您是否对 9 到 b'\t' 的映射感到困惑?那是因为字节9是制表符(或\t),字节10是换行符(\n),等等
  • @MarkRotteveel 哦,那我该怎么做才能发送 9 而不是 tab 值?
  • 发送 9 作为字节时,与制表符无法区分。 Python 恰好将其显示为b'\t'。如果你解释你的期望可能会更好。也许您想发送 字符 '9',而不是字节 9?

标签: java python sockets


【解决方案1】:

已解决(归功于@MarkRotteveel):

客户端发送

Socket s = new Socket();
s.connect(new InetSocketAddress(voids[1], 7800), 2000);
DataOutputStream writer = new DataOutputStream(s.getOutputStream());
data.remove("ObjectStream");
writer.writeInt(9); // used 9 for testing
writer.flush();

套接字接收和解码

amt = client.recv(self.SIZE)
amt = int.from_bytes(amt, byteorder="big")
amt = amt.decode()

【讨论】:

  • 您应该使用int.from_bytes(amt, byteorder="big", signed=True),否则您将无法正确解码负值。
  • 即使发送了 4 个字节,也不能保证您会在 client.recv(self.SIZE) 中收到 4 个字节。请参阅this 答案。
【解决方案2】:

对于您想通过套接字发送的任何内容,必须将其转换为特定格式,因此请使用函数 writeInt() -

DataOutputStream writer =
(DataOutputStream)data.get("ObjectStream");
data.remove("ObjectStream");
writer.writeInt(9); // used 9 for testing

【讨论】:

  • 您的意思是writeByte?顺便说一句:write 也会写入一个字节,但与writeByte 不同,它不会增加DataOutputStream 保留的写入字节数。
  • 但是函数 writeBytes() 只接受字符串输入,我也试过 writeByte() 并且它给出了相同的结果
  • 对不起,它是 writeInt() 的错误。检查我的答案我已经更新了它
  • @MarkRotteveel 字节计数器有什么作用?
  • 对不起,它是 writeInt() 的错误。检查我的答案我已经更新了它
猜你喜欢
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多