android - Android 上与 Python 的套接字通信

标签 android python sockets

我已经在我的 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 > 是选项卡的 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

并且选项卡上的脚本显示除最后一条 Toast 消息之外的所有消息。

我正在从 www.whatismyip.org 获取选项卡的 IP 地址。

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

我一直在使用指南 here将文件传输到我的标签。

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

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

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

最佳答案

关于“批量 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,网络使用它来访问“公共(public)互联网”(但这是另一回事)。

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

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

希望对您有所帮助。

关于android - Android 上与 Python 的套接字通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9657395/

相关文章:

Android SDK 剪切/修剪视频文件

python - mypy:在执行期间引发 TypeError

multithreading - 使用线程python套接字客户端,该客户端在后台监听并可以发送实时消息

python - 为什么我在 Python 中收到错误 "connection refused"? ( socket )

java - 将文件目录从 java 服务器映射到本地计算机

java - 如何知道条码已被扫描?

java - 如何在 Android 应用程序中存储数据

android - 在向 wifiiManager 添加新的 wifiConfiguration 时总是得到 -1

python - Python 中 Keras 库中的 Convolution2D 与 Conv2D

python - 我不知道我的 TensorFlow 程序出了什么问题