【问题标题】:python socket in android fails to connect to python server run in virtualboxandroid中的python套接字无法连接到在virtualbox中运行的python服务器
【发布时间】: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

【问题讨论】:

    标签: python android sockets virtualbox


    【解决方案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 中运行的服务器有关,但我还不知道为什么。我现在可以在我的主机和手机上成功完成。
    猜你喜欢
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2016-03-10
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多