java - python socket总是从java socket writeInt接收0
问题描述
我正在尝试通过套接字将整数从 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
值,它始终是单个 0 字节。我也尝试byteorder
在 python 服务器中进行更改,但没有用。这种行为的原因是什么?
编辑:我看起来我必须使用 4 个recv
函数来读取 4 个字节。我仍然很困惑为什么会发生这种情况writeInt
。随着writeUTF
我能够接收 1024 个字节的单个recv
.
解决方案
我认为正在发生的事情是你在 Python 端读取字节,但在 Java 端你正在发送int
一个 4 字节的数量。将发送 4 个字节,0 0 0 2
因此您可能会读取前 0 个字节。
有两件事要尝试,在 Python 端,读取四个字节并打印每个字节的结果。
然后在 Java 端,不是发送 2,而是发送0x01020304
(是的,这是一个数字)。这应该将发送的每个字节设置int
为 1 2 3 4,因此很容易阅读并查看您得到的部分。
从中您应该能够弄清楚如何int
从 Java 中读取 s 。如果 Python 有一个从字节数组或套接字一次读取四个字节的功能,那将会很方便。对不起,我不知道足够的 Python 来说明那会是什么。
推荐阅读
- python-3.x - 如何将字母数字转换为数字,同时保持字符串中的实际数字不变
- flutter - flutter:: 我可以在按钮或小部件中使用条件语句吗?
- dll - 没有可用的导入库时动态链接 Windows DLL?
- reactjs - React 组件的 Prop TypeScript 错误,使用 Styled-Components
- google-chrome - Chrome 扩展 CORB 问题
- android - CardView 布局折叠动画与冻结一起使用
- image - TYPO3 10.4 / FLUIDTEMPLATE / renderObj / 图像
- apache-beam - Apache Beam 管道中的大窗口
- haskell - Haskell 代码如何在使用列表推导时利用括号来分隔或整理信息?
- android - 从 Uri 获取图像并使用 ViewModel 组合显示