socketserver实现文件上传

news/2024/10/19 23:29:14

1.服务端

import  os
import json
import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
def put(self, *args):
cmd_dic = args[0]
filename = cmd_dic["filename"]
filesize = cmd_dic["size"]
if os.path.isfile(filename):
f = open(filename + ".new", "wb")
else:
f = open(filename, "wb")
self.request.send(b"200 ok")
received_size = 0
while received_size < filesize:
data = self.request.recv(1024)
f.write(data)
received_size += len(data)
else:
f.close()
print("file [%s] has uploaded..." % filename)


def handle(self):
while True:
try:
self.data = self.request.recv(1024).strip()
print("{} wrote".format(self.client_address[0]))
print(self.data)
cmd_dic = json.loads(self.data.decode())
action =cmd_dic["action"]
if hasattr(self, action):
func = getattr(self, action)
func(cmd_dic)
except ConnectionResetError as e:
print("error", e)
break

if __name__=="__main__":
HOST, PORT = "0.0.0.0", 22222
server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()

 

2.客户端

import socket, os
import json

class FtpClient(object):
def __init__(self):
self.client = socket.socket()
def connect(self, ip, port):
self.client.connect((ip, port))
def interactive(self):
while True:
cmd = input(">>:").strip()
if len(cmd) == 0: continue
cmd_str = cmd.split()[0]
if hasattr(self, "cmd_%s" % cmd_str):
func = getattr(self, "cmd_%s" % cmd_str)
func(cmd)
else:
self.help()
def help(self):
msg = """
ls
pwd
cd
get filename
wget filename
"""

def cmd_put(self, *args):
cmd_split = args[0].split()
if len(cmd_split) > 1:
filename = cmd_split[1]
if os.path.isfile(filename):
filesize = os.stat(filename).st_size
msg_dic = {
"action": "put",
"filename": filename,
"size": filesize,
"overridden": True
}
self.client.send(json.dumps(msg_dic).encode("utf-8"))
#防止粘包,等服务器确认
server_response = self.client.recv(1024)
f = open(filename, "rb")
for line in f:
self.client.send(line)
else:
print("file upload success...")
f.close()

else:
print(filename, "is not exist")
def cmd_wget(self):
pass


ftp = FtpClient()
ftp.connect("localhost", 22222)
ftp.interactive()

 

3.使用

put filename

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/73612.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

session测试

jsp1 <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head><meta charset="UTF-8"><title>session测试</title> </…

704.二分查找

题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例 1:输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4 示例 2:输入: nums = [-…

win11微软拼音输入法变繁体字

0. 设置→时间和语言 1. 时间和语言→语言和区域2. 中文简体→语言选项3. 键盘→微软拼音→键盘选项4. 常规5. 选择字符集→简体中文

泰山学堂选拔游记

泰山学堂选拔游记 前言:由于相关保密协议,所有与选拔试题与详细细节有关的内容将被剔除。 Tips:由于神秘因素,我在中学阶段的各个平台部分文章与笔记已经进行了隐藏。 插曲:等通知大学的经典通知方式 通过笔试后,要加对应取向面试群了解消息,但各个取向过笔试预留加面试…

mongo基本命令(一)

一 前言 环境: win10 mongo6.0.1 记录一些基本的mongo查询命令 二 查询命令 1 进入命令行 进入mongo命令行,我这里是mongo是装在docker里面的 需要先在docker里面启动mongo容器 docker exec -it xxx bash 进入mongo容器,xxx为mongo容器名 mongosh 进入mongo命令行,我安装…

Java21虚拟线程:我的锁去哪儿了?

0 前言 最近的文章中,我们详细介绍了当我们迁移到 Java 21 并将代际 ZGC 作为默认垃圾收集器时,我们的工作负载是如何受益的。虚拟线程是我们在这次迁移中兴奋采用的另一个特性。 对虚拟线程新手,它们被描述为“轻量级线程,大大减少编写、维护和观察高吞吐量并发应用程序的…

ManualResetEventManualResetEventSlim

ManualResetEvent ManualResetEvent有三个重要的方法,分别为:waiteone(),set(),reset(),其含义如下: 1.WaitOne()即等待信号发出,即可往下运行。 2.set()发出信号,让线程方法继续往下运行,并允许其他线程(如有)一并往下运行。 3.reset()重新初始化(即:去掉票据)变为…