博客
关于我
python tcp server传输成功之后进行删除_python学习之路(三)使用socketserver进行ftp断点续传...
阅读量:798 次
发布时间:2023-03-06

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

基于socketserver的TCP文件传输服务器实现

服务器端代码解析

以下是服务器端使用socketserver实现的TCP文件传输协议的详细代码解析:

服务器端设置

首先,服务器端需要设置适当的工作目录,并定义文件存放路径:

```pythonimport socketserverimport os

文件路径定义

文件路径定义为当前工作目录下的`file`文件夹:

```pythonfile_path = os.path.join(os.path.abspath('.'), 'file')```

处理TCP连接

服务器端通过socketserver实现TCP连接处理,定义了自定义的请求处理类:

class MyTCPHandler(socketserver.BaseRequestHandler):    def handle(self):        while True:            # 接收客户端数据            data = self.request.recv(100)            if not data.decode():                break

文件下载实现

当接收到客户端发送的`GET`命令时,服务器端进入文件下载模式:

```pythonelif data.decode().split()[0] == 'get': # 提取下载文件名和偏移量 file_name = data.decode().split()[1].split('|')[0] filename = os.path.join(file_path, file_name)
# 检查文件是否存在if os.path.exists(filename):    with open(filename, 'rb') as fd:        read_len = 0        while True:            send_data = fd.read(1024)            if not send_data:                break            # 根据偏移量决定是否发送数据            if read_len > int(offset):                # 通知客户端数据大小                self.request.send(ack_msg.encode())                client_ack = self.request.recv(50)                if client_ack.decode() == 'CLIENT_READY_TO_RECV':                    self.request.send(send_data)                    read_len += len(send_data)                    break            elif read_len <= int(offset):                continue            else:                self.request.send('END'.encode())                break

文件上传实现

当接收到客户端发送的`PUT`命令时,服务器端进入文件上传模式:

```pythonelif data.decode().split()[0] == 'put': # 提取上传文件名 file_name = data.decode().split()[1] filename = os.path.join(file_path, file_name) # 检查是否需要续传 log_name = os.path.join(file_path, 'offset.log') if os.path.exists(filename) and os.path.exists(log_name): with open(log_name) as f: offset = f.read().strip() else: offset = 0 # 通知客户端当前的偏移量 server_syn_msg = "offset %s" % offset self.request.send(server_syn_msg.encode()) # 接收客户端传输的数据 total_len = int(offset) while True: client_ack = self.request.recv(100) if client_ack.decode() == 'END': os.remove(log_name) break elif client_ack.decode().split('|')[0].strip() == 'SEND_SIZE': # 准备接收数据 recv_data = self.request.recv(1024) total_len += len(recv_data) # 将接收到的数据写入目标文件 with open(filename, 'ab') as fd: fd.write(recv_data) # 同时记录数据长度到日志文件 with open(log_name, 'w') as f: f.write(str(total_len))

服务器启动

最后,服务器通过socketserver启动并监听端口:

```pythonif __name__ == '__main__': host = 'localhost' port = 5000 server = socketserver.ThreadingTCPServer((host, port), MyTCPHandler) server.serve_forever()```

总结

以上代码实现了一个基于TCP协议的文件传输服务器,支持文件的下载和上传功能,通过socketserver框架简化了服务器端的开发复杂度。

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

你可能感兴趣的文章
Python 3.5、ldap3 和 modify_password()
查看>>
python 3.6.8 升级至3.9版本升级
查看>>
Python 3.9 到 Python 3.12 的发展历程与区别
查看>>
python 32位和64位的区别在哪
查看>>
Python 3:何时使用 dict,何时使用元组列表?
查看>>
Python 3d 绘图 - 轴居中
查看>>
python ==》 字典
查看>>
python anaconda 安装使用
查看>>
python and或or 当参数传递的时候的用法
查看>>
Python append() 与列表上的 + 运算符,为什么这些会给出不同的结果?
查看>>
Python APP自动化测试工具adb与Monkey使用详解
查看>>
Python APP自动化测试框架Appium详解
查看>>
Python APP自动化测试框架开发实战
查看>>
python argparse模块
查看>>
Python asyncio库的学习和使用
查看>>
Python AttributeError:“dict“对象没有属性“append“
查看>>
Python base64和hashlib模块
查看>>
python basic programs
查看>>
python bert_gen.py 报错Unable to load weights from pytorch checkpoint file for......
查看>>
python binascii.Error: Incorrect padding
查看>>