从Java客户端解码Python套接字字节

从Java客户端解码Python套接字字节,java,python,sockets,Java,Python,Sockets,从我的客户端,我向服务器发送变量大小的整数,当我在服务器上得到它时,它的数据格式与我需要的不同,我如何解码它 发送时的客户端代码 Socket s = new Socket(); s.connect(new InetSocketAddress(voids[1], 7800), 2000); DataOutputStream writer = new DataOutputStream(s.getOutputStream()); data.remove("ObjectStream"

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

发送时的客户端代码

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
用于接收的服务器端

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'

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

已解决(归功于@MarkRotterVeel):

客户端发送

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()

DataOutputStream
使用非常特定的序列化协议(类似于XDR)。您确定不想使用普通的
OutputStream
。但是,您显示的输出不会仅由该代码生成。请提供一个。对
DataOutputStream
仅调用
write(9)
将只生成字节
9
,仅此而已。因此,要么这不是一个
java.io.DataOutputStream
,要么你在写(9)之前和之后都在写更多的数据。您可能还想指定实际期望的结果。您是否对9到
b'\t'
的映射感到困惑?这是因为字节9是制表符(或
\t
),字节10是换行符(
\n
),等等@markrotVeel噢,那么我要怎么做才能发送9而不是制表符值呢?当将9作为字节发送时,它与制表符无法区分。Python恰好将其显示为
b'\t'
。如果你能解释一下你的期望可能会更好。也许你想发送字符“9”,而不是字节9?你是说?顺便说一句:,也将写入一个字节,但是,与
writeByte
相反,它不会增加
DataOutputStream
保留的写入字节的计数器。但是函数writeBytes()只接受字符串输入,我也尝试了writeByte(),并且它给出了相同的结果,对于它的writeInt()错误表示抱歉。检查我更新的答案it@MarkRotteveel字节计数器的作用是什么?很抱歉,它是writeInt()。检查我的答案我已经更新了。你应该使用
int.from_bytes(amt,byteorder=“big”,signed=True)
,否则你将无法正确解码负值。即使发送了4个字节,也不能保证你在
client.recv(self.SIZE)
中收到4个字节。见答案。