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

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


被整了两三回以后,我开始考虑把写的东西保存起来。这个程序最好小于一屏,以便我直接粘贴到远程终端。我考虑过实现一个已有协议,这样,在客户端可以用现成的工具。一番搜索,无果,看起来最简单的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)


  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Python3可以使用socket模块实现基于TCP协议的客户/服务器的网络文件传输程序。下面是一个简单的示例: 服务器端程序: ``` import socket def server(): # 创建socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定IP和端口 server_ip = '127.0.0.1' server_port = 8888 server_socket.bind((server_ip, server_port)) # 开启监听 server_socket.listen(5) print('服务器已启动,等待连接...') while True: # 接受客户端连接请求 client_socket, client_address = server_socket.accept() print('客户端已连接:', client_address) # 接收文件名 file_name = client_socket.recv(1024).decode() print('接收到的文件名:', file_name) # 打开文件并读取内容 try: with open(file_name, 'rb') as file: data = file.read() client_socket.sendall(data) print('文件传输成功') except FileNotFoundError: client_socket.sendall(b'file not found') print('文件不存在') # 关闭连接 client_socket.close() if __name__ == '__main__': server() ``` 客户端程序: ``` import socket def client(): # 创建socket对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 server_ip = '127.0.0.1' server_port = 8888 client_socket.connect((server_ip, server_port)) # 发送文件名 file_name = 'test.txt' client_socket.send(file_name.encode()) # 接收文件内容 data = client_socket.recv(4096) if data == b'file not found': print('文件不存在') else: # 将文件内容写入本地文件 with open('received_file.txt', 'wb') as file: file.write(data) print('文件传输成功') # 关闭连接 client_socket.close() if __name__ == '__main__': client() ``` 以上程序实现一个简单的基于TCP协议的网络文件传输程序。服务器端监听客户端连接请求,接收客户端发送的文件名,根据文件名读取文件内容并发送给客户端。客户端连接服务器后发送文件名,接收服务器发送的文件内容,并将文件内容写入本地文件。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值