代码之家  ›  专栏  ›  技术社区  ›  foosion

使用python通过wifi在计算机和移动电话之间进行简单的文件传输

  •  5
  • foosion  · 技术社区  · 16 年前

    我想能够在我的手机和电脑之间传送文件。手机是一款可以运行python 2.5.4的智能手机,电脑运行的是windows xp(使用python 2.5.4和3.1.1)。

    我想在电话上有一个简单的python程序,可以将文件发送到计算机并从计算机获取文件。电话端只能在被调用时运行,计算机端可以是服务器,但最好是不使用大量资源的服务器。电话端应该能够找出计算机上相关目录中的内容。

    目前,我通过在计算机上运行Windows Web Server(ugh)和一个带有socket.set默认访问点的脚本(这样程序可以选择路由器的ssid或其他传输),以及在电话上执行urlretrieve(获取文件)来从计算机到电话获取文件。我用smtplib通过电子邮件发送文件。

    无论是一个总的想法,现有的计划或两者之间的任何建议都会受到赞赏。

    3 回复  |  直到 16 年前
        1
  •  3
  •   rh0dium    16 年前

    我会用 paramiko .它的安全性很快,而且非常简单。这个怎么样?

    因此,我们从导入模块开始,并指定日志文件:

    import paramiko
    paramiko.util.log_to_file('/tmp/paramiko.log')
    

    我们打开一个ssh传输:

    host = "example.com"
    port = 22
    transport = paramiko.Transport((host, port))
    

    接下来我们要进行身份验证。我们可以使用密码来完成此操作:

    password = "example101"
    username = "warrior"
    transport.connect(username = username, password = password)
    

    另一种方法是使用ssh密钥:

    import os
    privatekeyfile = os.path.expanduser('~/.ssh/id_rsa')
    mykey = paramiko.RSAKey.from_private_key_file(privatekeyfile)
    username = 'warrior'
    transport.connect(username = username, pkey = mykey)
    

    现在我们可以启动sftp客户机:

    sftp = paramiko.SFTPClient.from_transport(transport)
    

    现在让我们将一个文件从远程拉到本地系统:

    filepath = '/home/zeth/lenna.jpg'
    localpath = '/home/zeth/lenna.jpg'
    sftp.get(filepath, localpath)
    

    现在我们换个方向:

    filepath = '/home/zeth/lenna.jpg'
    localpath = '/home/zeth/lenna.jpg'
    sftp.put(filepath, localpath)
    

    最后,我们需要关闭sftp连接和传输:

    sftp.close()
    transport.close()
    

    怎么样??我必须给予 credit 以这个为例。

        2
  •  1
  •   foosion    16 年前

    最后我在电话上使用了python的ftplib,在电脑上使用了ftp服务器filezilla。尽管可能存在安全问题,但其优点是高度简单。

    如果有人关心,下面是客户端代码发送和接收文件的勇气。实际的实现有更多的基础设施。

    from ftplib import FTP
    import os
    
    ftp = FTP()
    ftp.connect(server, port)
    ftp.login(user, pwd)
    
    files = ftp.nlst() # get a list of files on the server
    # decide which file we want
    
    fn = 'test.py' # filename on server and for local storage
    d = 'c:/temp/' # local directory to store file
    path = os.path.join(d,fn)
    r = ftp.retrbinary('RETR %s' % fn, open(path, 'wb').write)
    print(r) # should be: 226 Transfer OK
    
    f = open(path, 'rb') # send file at path
    r = ftp.storbinary('STOR %s' % fn, f) # call it fn on server
    print(r) # should be: 226 Transfer OK
    f.close()
    
    ftp.quit()
    
        3
  •  0
  •   Esteban Küber    16 年前

    a couple of examples 但是你必须记住,iirc,pybluez只能在Linux上工作。

    我以前做过与OBEX相关的工作,主要是从 移动电话,使用obexftp程序 2 哪个是 OpenObex项目 3 . 当然,您可以从调用obexftp程序 并使用中的函数解释响应和退出代码 操作系统、popen2和子进程模块。我相信OBexftp也 支持“推”模式,但您可能会找到其他功能 如果没有,则与openobex相关。

    因为在GNU中使用套接字支持蓝牙通信/ Linux发行版和python(前提是蓝牙支持 已检测到并配置),您可以使用 简单的网络编程,但这可能需要您 自己实现OBEX协议-这不是一个简单的任务 原因很多,包括我在下面提到的一个。因此,它的 至少在最初,使用obexftp可能更容易。

    你也有 lightblue ,这是一个交叉操作系统蓝牙库。

    还有一个完整的脚本, PUTools: Python Utility Tools for PyS60 Python (示例有Windows屏幕截图),它具有:

    python解释器,接收输入并在PC上显示输出,通过蓝牙连接到电话,然后在电话上执行。您还可以获得手机的简单外壳功能(CD、LS、RM等)。该工具还允许您同步从PC到电话(在应用程序开发中非常有用)和从电话到PC(您的图像、正在处理的程序的日志文件等)的文件。