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