【问题标题】:Socket communication with Python on AndroidAndroid 上与 Python 的 Socket 通信
【发布时间】:2012-03-28 06:45:22
【问题描述】:

我在我的 Android 驱动的 Galaxy Tab 上安装了 sl4a 和 Python。我在使用 python 的 socket 模块在笔记本电脑和手机之间进行通信时遇到了问题。

这个example 在我编写仅限计算机的python 程序时一直对我很好,但在计算机/选项卡设置上却没有按预期工作。这是我在 Tab 上运行的代码:

import socket, android
droid=android.Android()
droid.makeToast('Running...')
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 50111))
droid.makeToast('Socket has been bound')
s.listen(1)
conn, addr = s.accept()
droid.makeToast('Connection has been accepted')

我在笔记本电脑上执行的代码(<Tab IP Address> 是 Tab 的 IP 地址):

import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('<Tab IP address>', 50111))

客户端脚本(在笔记本电脑上)错误:

socket.error: [Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

Tab 上的脚本会显示除最后一条 Toast 消息之外的所有消息。

我从 www.whatismyip.org 获取 Tab 的 IP 地址。

本地套接字编程(即连接到 IP 地址“localhost”并在选项卡上运行客户端和服务器)工作正常。

我一直在使用指南 here 将文件传输到我的选项卡。

就上下文而言,我项目的最终期望目标是能够通过在我的笔记本电脑上执行命令,通过我的 Tab 发送文本。我确信解决方案已经存在,但我想自己学习如何做!

编辑:[添加 21/03/12] 如果我将 Tab 连接到我的 wifi 网络并使用 192.168.0.xx 地址,上面的代码可以正常工作(在 Tab 和笔记本电脑之间进行通信)。这让我相信问题在于我用来连接 Tab 的 IP 地址,而不是代码本身。我会继续努力的。任何有关找到要连接的 IP 地址的最佳方法的建议,或者我可能会犯的错误,将不胜感激。

再次编辑:通过阅读 this questionthis link,我得出结论,智能手机(和平板电脑)的 IP 地址不是静态的,因此在这种情况下将移动设备视为服务器是错误的方式去做吧。我会重新考虑我的程序结构。 虽然我现在知道这是构建交互的错误方式,但我仍然不完全理解为什么它会失败。通过阅读前面的链接,我怀疑我从 www.whatismyip.org 获得的 IP 地址不是我的 Tab 所独有的,而是属于我的网络提供商的“批量 IP”,然后可以从中建立连接转发到单个设备(与网络路由器可以将连接到自己的连接转发到网络上的单个设备一样)。但是,我不确定这一点,也想不出任何方法来验证它(除了寻找与我在同一网络上、住在同一小区区域的人,并询问他们的移动 IP)。如果有人能澄清这一点,我将不胜感激。

【问题讨论】:

    标签: android python sockets


    【解决方案1】:

    您对“批量 IP”的看法是对的。当您通过 wi-fi 连接手机时,它将从路由器的可用 IP 地址池中获取一个随机 IP。

    如果您有固定数量的设备连接到路由器,它通常会获得相同的 IP。例如,如果您有 3 台计算机通过电缆和 1 部智能手机连接,那么手机将始终获得 192.168.1.5 IP(192.168.1.2 - .4 IP 用于您的计算机)。

    根据您拥有的路由器,您可以将其设置为每次将智能手机连接到 Wi-Fi 时为其提供完全相同的地址。而您从www.whatismyip.org 使用的IP 是来自提供商的IP,网络使用它来访问“公共互联网”(但这是另一回事)。

    您应该检查平板电脑上的本地 IP(设置->Wi-Fi->Wi-Fi 设置-> 并按连接。应该会出现一个带有您的 IP 的小信息框)。

    你应该在你的服务器代码中使用它。

    我希望这会有所帮助。

    【讨论】:

    • @scubbo 很高兴它有帮助。
    猜你喜欢
    • 2020-07-06
    • 2013-09-09
    • 2012-08-23
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    相关资源
    最近更新 更多