如何从Windows宿主机连接VirtualBox内Linux虚拟机的Python Socket服务
Socket跨VirtualBox虚拟机通信失败排查方案
- 确认服务端监听配置正确
服务端代码必须绑定非本地回环地址才能被宿主机访问,不可仅绑定127.0.0.1,需绑定0.0.0.0(监听所有网卡)或虚拟机对外IP192.168.1.33,且绑定的端口需和客户端连接端口完全一致。服务端参考代码如下:import socket server = socket.socket() # 绑定0.0.0.0和9090端口,和客户端连接端口保持一致 server.bind(('0.0.0.0', 9090)) server.listen(5) conn, addr = server.accept() print(f"来自{addr}的连接") - 放开Linux虚拟机防火墙端口
默认Linux防火墙会拦截外部请求,需手动放开监听端口:
若使用ufw防火墙,执行命令:ufw allow 9090/tcp
若使用firewalld防火墙,执行命令:
测试阶段可临时关闭SELinux避免拦截:firewall-cmd --add-port=9090/tcp --permanent firewall-cmd --reloadsetenforce 0 - 验证端口监听状态
在虚拟机内执行命令:ss -tulnp | grep 9090,若有对应Python进程的监听输出,说明服务端正常启动,否则检查服务端代码报错信息。 - 放开Windows宿主机防火墙限制
临时关闭Windows Defender防火墙测试,或手动添加Python客户端程序的出站规则,避免请求被宿主机防火墙拦截。 - 修复客户端代码错误
你当前的客户端代码send方法直接传入字符串会触发类型错误,需改为传输bytes类型:import socket cliente = socket.socket() try: # 端口和服务端绑定的端口一致即可 cliente.connect(('192.168.1.33',9090)) # 转成bytes再发送 cliente.send(b"1") except Exception as e: print(f"连接失败:{e}")
核心逻辑:客户端连接的端口必须是服务端代码中bind方法指定的端口,无需随意试其他端口,两端端口保持一致即可。
内容的提问来源于stack exchange,提问作者Gie Grajo
相关产品推荐
相关产品推荐

