android中的python套接字无法连接到在virtualbox中运行的python服务器

Posted

技术标签:

【中文标题】android中的python套接字无法连接到在virtualbox中运行的python服务器【英文标题】:python socket in android fails to connect to python server run in virtualbox 【发布时间】:2021-12-23 20:59:18 【问题描述】:

我将我的安卓手机和电脑都连接到了同一个 Wifi,在虚拟盒子中运行 python 服务器的电脑。我可以将客户端连接到同一个 VirtualBox 中的服务器,但不能通过手机工作。我对网络的了解有限。我想来自服务器和客户端的 IP 地址是相同的,它应该可以工作。谁能给我一些提示为什么它无法连接以及如何调试它?

我在 VirtualBox Ubuntu 的终端中输入主机名 -I 并得到

10.0.2.15. 

我已经在 androidManifest.xml 中添加了这个


 <uses-permission android:name="android.permission.INTERNET" /> 

python 服务器代码

server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
port = 10050
socket_address = ('10.0.2.15',port)
server_socket.bind(socket_address)
server_socket.listen(5)
client_socket,addr = server_socket.accept()

android python客户端代码(我使用chaquo.python.android在android上运行python脚本)

def connect():
    client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    host_ip = '10.0.2.15'
    port = 10050 
    client_socket.connect((host_ip,port))

android 上的错误

Process: com.example.simplecamera, PID: 17958
com.chaquo.python.PyException: TimeoutError: [Errno 110] Connection timed out

【问题讨论】:

【参考方案1】:

如果python服务器的代码与你正在执行的代码完全相同,我建议你更改

client_socket,addr = server_socket.accept()

while True:
    client_socket,addr =server_socket.accept()
    print('[+] connection from>>',addr)

服务器需要持续运行才能连接和接受

所以程序看起来像

server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
port = 10050
socket_address = ('10.0.2.15',port)
server_socket.bind(socket_address)
server_socket.listen(5)
while True:
    client_socket,addr =server_socket.accept()
    print('[+] connection from>>',addr)
    #to close connection
    client_socket.close()
   

查看https://github.com/dntfury/scaling-winner/blob/master/server_client_part_2/Server.py 以获得完全相同的服务器

【讨论】:

首先谢谢。但是 server_socket.accept() 正在阻止从客户端获取连接,不是吗?此外,当我的客户端和服务器在同一个 Virtualbox 上运行时,它们可以成功运行。 上述程序是一个简单的版本,但可以正常工作。线程可用于改进它或进行更改以使其成为非阻塞。客户端和服务器在同一台机器上也可以正常工作,但您需要将 IP 设置为“0.0.0.0”才能连接来自同一网络的不同设备。 我刚刚尝试了 ip 0.0.0.0 和您的代码,但仍然无法正常工作。顺便说一句,为什么 0.0.0.0 会起作用?我的意思是它阻塞的事实很好,因为它等待客户端连接。问题是另一台设备上的客户端无法识别该 ip 以连接到服务器...对吗? 我认为问题与在 VirtualBox 中运行的服务器有关,但我还不知道为什么。我现在可以在我的主机和手机上成功完成。

以上是关于android中的python套接字无法连接到在virtualbox中运行的python服务器的主要内容,如果未能解决你的问题,请参考以下文章

无法连接到android上的蓝牙套接字

无法连接到 android 5.1 上的本机本地套接字

Expo react-native 将无法连接到 socketio(Android 和 iOS)

Python错误:打印(数据+“\ n”)类型错误:尝试通过网络套接字发送命令时无法将str连接到字节[重复]

initctl:无法连接到 Upstart:无法连接到套接字 /com/ubuntu/upstart:docker 映像中的连接被拒绝

在swift 3中无法连接到xmpp中的套接字