Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python套接字始终从java套接字writeInt接收0_Java_Python_Sockets - Fatal编程技术网

python套接字始终从java套接字writeInt接收0

python套接字始终从java套接字writeInt接收0,java,python,sockets,Java,Python,Sockets,我正在尝试通过套接字将整数从java发送到python。这里python是服务器,java是客户端 这是密码 Python服务器: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("localhost",999)) s.listen(5) con,addr=s.accept() num=con.recv(4) print(int.from_bytes(num,byteorder='big'))#alw

我正在尝试通过套接字将整数从java发送到python。这里python是服务器,java是客户端

这是密码 Python服务器:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("localhost",999))
s.listen(5)
con,addr=s.accept()
num=con.recv(4)
print(int.from_bytes(num,byteorder='big'))#always zero
Java客户端:

    Socket s=new Socket("localhost",999);
    dos=new DataOutputStream(s.getOutputStream());
    dos.writeInt(2);
在python服务器中,无论我在java客户机中发送什么,我总是收到0值。我选中了
num
value,它总是一个0字节。我还尝试在python服务器中更改
字节顺序
,但没有用。这种行为的原因是什么

编辑:
我似乎必须使用4个
recv
函数来读取4个字节。我仍然不明白为什么这会发生在
writeInt
上。使用
writeUTF
我可以通过单个
recv

接收1024个字节,我想是在Python端读取字节,但在Java端发送的是
int
,这是一个4字节的量。4个字节将作为
02
发送,因此您可能正在读取前0个字节

在Python方面,有两件事需要尝试,读取四个字节并打印每个字节的结果

然后在Java端,不是发送2,而是发送
0x01020304
(是的,这是一个数字)。这应该将
int
发送的每个字节设置为1、2、3、4,这样就很容易读取并查看得到的是哪一块


因此,您应该能够了解如何从Java中读取
int
s。不过,如果Python有一个从字节数组或套接字一次读取四个字节的功能,这将非常方便。很抱歉,我对Python的了解不够,无法说出这将是什么。

这很奇怪。。。除非出于任何原因,读取Python端没有返回4字节。由于Java
writeInt
明确使用大端顺序,如果
read
返回的字节少于4个,它将转换为0。发送int值后,能否立即从Java端关闭套接字?竞争条件可能导致套接字在数据包发送到网络之前关闭。然后Python将读取0个字节(流的末尾),这将产生0…@SergeBallesta我在关闭套接字之前尝试了睡眠,但仍然没有用。我尝试了你的解决方案,它是有效的。但是为什么我指定了4个字节,python却只读取1个字节呢。这不会以书面形式发生。我可以用网络中常见的一个recvIt读取整个字符串。像TCP/IP这样的低级API中没有元数据。只有一个字节流。您已经告诉它接收4个字节,但它只知道这些。所以你得到了字节。您需要告诉它将字节解释为其他内容,如整数。对不起,我对Python的了解不够,无法说出这是什么。(在Java中,一个很好的解决方案是使用
DataInputStream
,它是您已经在使用的
DataOutputStream
的补充。)