博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用Python实现一个简单的文件传输协议
阅读量:6160 次
发布时间:2019-06-21

本文共 2293 字,大约阅读时间需要 7 分钟。

36人阅读
(0)

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

 

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

 

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

服务器端:

[python]
  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()  
#!/usr/bin/pythonimport SocketServer# Format: name_len      --- one byte#         name          --- name_len bytes#         data          --- variable length# Save data to name into current directoryaddr = ('', 1234)class MyTCPHandler (SocketServer.StreamRequestHandler):        def handle (self):                name_len = ord(self.rfile.read(1))                name = self.rfile.read(name_len)                print "Get request:%s"%name                fd = open(name, 'w')                cont = self.rfile.read(4096)                    while cont:                        fd.write(cont)                        cont = self.rfile.read(4096)                fd.close()                print "Out :%s"%nameserver = SocketServer.TCPServer(addr, MyTCPHandler)server.serve_forever()

客户端:

 

[python]
  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)  

转载地址:http://upefa.baihongyu.com/

你可能感兴趣的文章
Linux磁盘分区与挂载
查看>>
J2se学习笔记一
查看>>
DNS视图及日志系统
查看>>
老李分享:Android性能优化之内存泄漏 3
查看>>
mysql命令
查看>>
来自极客标签10款最新设计素材-系列七
查看>>
极客技术专题【009期】:web技术开发小技巧
查看>>
PHP 简单计算器代码实现
查看>>
正则表达式的知识普及
查看>>
docker使用笔记
查看>>
华为eNSP模拟器上实现FTP服务
查看>>
【全球AI人才排行榜】美国第一,中国仅排名第7
查看>>
微信小程序输入框input
查看>>
MySql字符串函数使用技巧
查看>>
Doc2Vec,Word2Vec文本相似度 初体验。
查看>>
系统ghost后变成一个盘了别的分区的文件怎么找回
查看>>
Win7+Ubuntu11
查看>>
请问华为三层交换机里面的那个从IP是个什么意思? -
查看>>
kFeedback开源啦
查看>>
大数据传输,文件传输的专业解决方案!
查看>>