【问题标题】:How to transfer a file between two connected computers in python?如何在python中的两台连接的计算机之间传输文件?
【发布时间】:2012-02-02 01:25:45
【问题描述】:

我不知道之前是否已经回答过这个问题(我在网上查看但找不到),但是我如何通过网络将文件(如果可能的话 .exe)发送到另一台连接到网络?我尝试了套接字,但我只能发送字符串,并且我尝试学习 ftplib,但我根本不理解它,或者如果 ftp 甚至是我正在寻找的东西,所以我完全处于停滞状态。任何输入都表示赞赏(如果有人可以解释 FTP,它是否像套接字?我见过的所有示例都没有客户端可以连接到的服务器程序。)

【问题讨论】:

  • 用普通套接字当然可以做到这一点。你尝试了什么?
  • 你应该只使用scp甚至rsync

标签: python file sockets


【解决方案1】:

A. Python3

我们可以为此使用http.server。从SO answer hereSimpleHTTPServer 移动到http.server 中的python3

python -m http.server

Python2

我有时会为此使用SimpleHTTPServer

python -m SimpleHTTPServer

...它将在端口 8000 上提供当前目录中的文件。在另一台计算机上打开您的网络浏览器并下载您想要的任何内容。

要知道您计算机的 IP 地址,您可以使用(在 Ubuntu 中)ifconfig,例如:

$ ifconfig
enp0s31f6 Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:10.0.0.3  Bcast:10.0.0.255  Mask:255.255.255.0

在 Windows 中是ipconfig

然后,在另一台计算机上,您将浏览器发送至:http://10.0.0.3:8000

B.如果您启用了 SSH,您可以使用 paramiko 进行连接和 SFTP 传输任何您想要的。

【讨论】:

  • +1 为您刚刚添加到我的曲目中的两条有价值的知识!
【解决方案2】:

看看 paramiko。它可以做scp和sftp。

http://www.lag.net/paramiko/

【讨论】:

    【解决方案3】:

    发送端的一些简单示例代码:

    if os.path.exists(df):
      with open(df, 'rb') as f:
        packet = f.read(blocksize)
    
        while packet != '':
          conn.send(packet)
    
          packet = f.read(blocksize)
    

    地点:

    df = 'path/to/data/file'
    blocksize = 8192 # or some other size packet you want to transmit.  
                     # Powers of 2 are good.
    conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    

    【讨论】:

    • 好的,谢谢,那么就不需要 FTP 了吗?我还是不太明白它是干什么用的
    • @Baboon - FTP 是一种用于文件传输的专用协议,是的。它包括客户端/服务器同意的许多便利 - 确认、状态更新、重试、并发等。您可以阅读此 RFC 中的整个规范:ietf.org/rfc/rfc959.txt。但是,FTP 不是传输文件的唯一方式,使用套接字传输数据绝对是可能的。通常,服务器和客户端需要就词汇/对话达成一致,并且知道如何在文件完全传输时达成一致。
    【解决方案4】:

    ZeroMQ 有助于替换套接字。

    您可以在一个命令中发送整个文件。

    ZMQ“派对”可以用任何主要语言编写,对于给定的 ZMQ 驱动的软件,它的另一端是用什么编写的并不重要。

    来自他们的网站:

    它为您提供了在各种不同的环境中携带整个消息的套接字 进程内、进程间、TCP 和多播等传输。你可以 使用 fanout、pub-sub、task 等模式连接 N-to-N 套接字 分发和请求-回复。

    【讨论】:

      最近更新 更多