用Python实现一个简单的文件传输协议
2012-11-04 00:09
866 查看
写个东西并非无聊或者练手,而是厌烦了每次都得重头写。我已经不是第一次碰到下面的情况:远程到一台可以连接内网的机器,结果发现其环境极为恶劣,没有scp。最夸张的一次,我见过一台机器连man都没装。所幸装了ssh可以让我远程。但没有scp怎么传文件呢?ftp?试了几个命令,没有。HTTP?客户端或者服务器端软件都没有。python?有的。尼玛,最后在远程机器上用python写了个简单的服务器,终于可以传文件了。当然,首先要传scp。
被整了两三回以后,我开始考虑把写的东西保存起来。这个程序最好小于一屏,以便我直接粘贴到远程终端。我考虑过实现一个已有协议,这样,在客户端可以用现成的工具。一番搜索,无果,看起来最简单的TFTP我都嫌太复杂了。于是我放弃这一想法,直接实现一个超原始的协议。最后写出来的客户端和服务器端代码长度都在一屏之内(23行;校准终端24行;vi的状态栏占了一行)。
我还是希望以后别遇到这种问题:用不能自动解决依赖的方法装软件太痛苦了。Python现在也像Perl一样无处不在,不得不感叹,有了这些脚本语言几乎相当于有了一切。
服务器端:
客户端:
#!/usr/bin/python
from socket import *
import os.path
import sys
target = ('',1234)
def get_header (name):
leng = len(name)
assert leng < 250
return chr(leng) + name
def send_file (name):
basename = os.path.basename(name)
header = get_header(basename)
cont = open(name).read()
s = socket (AF_INET, SOCK_STREAM)
s.connect(target)
s.sendall (header)
s.sendall (cont)
s.close()
for i in sys.argv[1:]:
print i
send_file (i)
被整了两三回以后,我开始考虑把写的东西保存起来。这个程序最好小于一屏,以便我直接粘贴到远程终端。我考虑过实现一个已有协议,这样,在客户端可以用现成的工具。一番搜索,无果,看起来最简单的TFTP我都嫌太复杂了。于是我放弃这一想法,直接实现一个超原始的协议。最后写出来的客户端和服务器端代码长度都在一屏之内(23行;校准终端24行;vi的状态栏占了一行)。
我还是希望以后别遇到这种问题:用不能自动解决依赖的方法装软件太痛苦了。Python现在也像Perl一样无处不在,不得不感叹,有了这些脚本语言几乎相当于有了一切。
服务器端:
#!/usr/bin/python import SocketServer # Format: name_len --- one byte # name --- name_len bytes # data --- variable length # Save data to name into current directory addr = ('', 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"%name server = SocketServer.TCPServer(addr, MyTCPHandler) server.serve_forever()
客户端:
#!/usr/bin/python
from socket import *
import os.path
import sys
target = ('',1234)
def get_header (name):
leng = len(name)
assert leng < 250
return chr(leng) + name
def send_file (name):
basename = os.path.basename(name)
header = get_header(basename)
cont = open(name).read()
s = socket (AF_INET, SOCK_STREAM)
s.connect(target)
s.sendall (header)
s.sendall (cont)
s.close()
for i in sys.argv[1:]:
print i
send_file (i)
相关文章推荐
- 用Python实现一个简单的文件传输协议
- 用Python实现一个简单的文件传输协议
- Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
- Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
- 代码笔记 | 一个用python实现的简单的文件服务器
- python cs架构实现简单文件传输
- Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
- 设计和实现简单的协议,支持传输文件名和文件内容
- 一个简单的文件传输验证码识别c/s实现
- python cs架构实现简单文件的传输
- 自行控制loadrunner的socket协议性能测试 (转) 一前言 二任务的提出 三实现方案讨论 四技术要点讲解 如何开始录制一个最简单的收发数据包脚本 写日志文件 一行一行读数据包文件 字
- 从Apache的日志文件收集和提供统计数据(一个Python插件架构的简单实现)
- 使用一个简单的python脚本将一个本地文件以码流的形式,通过UDP协议发送到对端:
- Python实现简单的文件传输与MySQL备份的脚本分享
- python实现的一个p2p文件传输实例
- python实现的一个p2p文件传输实例
- Python实现的简单文件传输服务器和客户端
- Python实现简单的文件传输与MySQL备份的脚本分享
- 用socket实现简单的文件传输
- java的IO流来实现一个最简单的文件复制