zoukankan      html  css  js  c++  java
  • 用Python实现一个简单的文件传输协议

    用Python实现一个简单的文件传输协议 - 但是博客很漂亮 - 博客频道 - CSDN.NET

    用Python实现一个简单的文件传输协议

    36人阅读 评论(0) 收藏 举报

    写个东西并非无聊或者练手,而是厌烦了每次都得重头写。我已经不是第一次碰到下面的情况:远程到一台可以连接内网的机器,结果发现其环境极为恶劣,没有scp。最夸张的一次,我见过一台机器连man都没装。所幸装了ssh可以让我远程。但没有scp怎么传文件呢?ftp?试了几个命令,没有。HTTP?客户端或者服务器端软件都没有。python?有的。尼玛,最后在远程机器上用python写了个简单的服务器,终于可以传文件了。当然,首先要传scp。

    被整了两三回以后,我开始考虑把写的东西保存起来。这个程序最好小于一屏,以便我直接粘贴到远程终端。我考虑过实现一个已有协议,这样,在客户端可以用现成的工具。一番搜索,无果,看起来最简单的TFTP我都嫌太复杂了。于是我放弃这一想法,直接实现一个超原始的协议。最后写出来的客户端和服务器端代码长度都在一屏之内(23行;校准终端24行;vi的状态栏占了一行)。

    我还是希望以后别遇到这种问题:用不能自动解决依赖的方法装软件太痛苦了。Python现在也像Perl一样无处不在,不得不感叹,有了这些脚本语言几乎相当于有了一切。

    服务器端:

    1. #!/usr/bin/python  
    2. import SocketServer  
    3.   
    4. # Format: name_len      --- one byte  
    5. #         name          --- name_len bytes  
    6. #         data          --- variable length  
    7. # Save data to name into current directory  
    8. addr = (''1234)  
    9. class MyTCPHandler (SocketServer.StreamRequestHandler):  
    10.         def handle (self):  
    11.                 name_len = ord(self.rfile.read(1))  
    12.                 name = self.rfile.read(name_len)  
    13.                 print "Get request:%s"%name  
    14.                 fd = open(name, 'w')  
    15.                 cont = self.rfile.read(4096)      
    16.                 while cont:  
    17.                         fd.write(cont)  
    18.                         cont = self.rfile.read(4096)  
    19.                 fd.close()  
    20.                 print "Out :%s"%name  
    21.   
    22. server = SocketServer.TCPServer(addr, MyTCPHandler)  
    23. server.serve_forever()  

    客户端:

    1. #!/usr/bin/python  
    2. from socket import *  
    3. import os.path  
    4. import sys  
    5. target = ('',1234)  
    6. def get_header (name):  
    7.         leng = len(name)  
    8.         assert leng < 250  
    9.         return chr(leng) + name  
    10.   
    11. def send_file (name):  
    12.         basename = os.path.basename(name)  
    13.         header = get_header(basename)  
    14.         cont = open(name).read()  
    15.         s = socket (AF_INET, SOCK_STREAM)  
    16.         s.connect(target)  
    17.         s.sendall (header)  
    18.         s.sendall (cont)  
    19.         s.close()  
    20.   
    21. for i in sys.argv[1:]:  
    22.         print i  
    23.         send_file (i)  
  • 相关阅读:
    URLOS用户福利:申请免费的泛域名(通配符域名)SSL证书
    主机管理面板LuManager以Apache2协议开源发布,可用作商业用途
    微服务设计概览
    使用SpringBoot搭建Web项目
    公共方法整合(四)数组相关
    阿里云短信整合封装类库
    高德地图接口使用整理
    公共方法整合(三)时间相关方法
    PHP 服务端友盟推送
    html 录音并上传
  • 原文地址:https://www.cnblogs.com/lexus/p/2843339.html
Copyright © 2011-2022 走看看