从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'
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个字节。见答案。