CS架构的FTP程序(socketserver实现高并发)
使用socketserver的模块实现多线程并发 # 并发就是同时执行多任务
该模块与sock模块不同之处是该模块自动帮我们分装好了一些功能,实现高并发的功能,让我们在编程的时候直接调用这些功能就可以了,节省了编程步骤
class socketserver.ForkingTCPServer # 这个是TCP协议开进程,Forking的用处就是没过来一个链接生成一个进程
class socketserver.ForkingUDPServer # 这个是UDP协议开进程
class socketserver.ThreadingTCPServer # 这个是TCP协议开线程
class socketserver.ThreadingUDBServer # 这个是UDP协议开线程
基础版的Ftp
server.py
import json
import socket
s = socket.socket()
s.bind(('localhost',8000))
s.listen(5)
while True:
print('监听中')
conn,client_addr = s.accept()
print(conn)
print('-')
print(client_addr) # 这个是client的地址
while True:
data = conn.recv(1024)
data = json.loads(data.decode()) # 收到的json格式要解码成系统的编码
if data.get('action') is not None: # 判断发过来的头信息里面有请求类型
if data['action'] == 'put':
with open(data['filename'],'wb')as file_obj: # 定义文件名并打开文件,这里就是文新建了个件
received_size = 0 # 这个就是用来存放bytes类型的数据
while received_size < data['size']:
recv_data = conn.recv(1024) # 这里必须是从conn对象中每次接收1024的数据
file_obj.write(recv_data)
received_size += len(recv_data) # 每次接收后把数据的长度做累积
else:
print('文件接收成功')
elif data['action'] == 'get': # 这个是发送文件的
pass
client.py
import json
import os
import socket
client = socket.socket()
client.connect(('localhost',8000))
while True:
choice = input('请输入内容: ').strip()
if len(choice) == 0:continue
cmd_list = choice.split() # 切分指令,获取指令
if cmd_list[0] == 'put': # put上传
if len(cmd_list) == 1: # 用长度判断有没有文件
print('没有文件')
continue
filename = cmd_list[1]
if os.path.isfile(filename): # 用os模块下的方法判断文件是否存在
with open(filename,'rb')as file_obj: # 用rb模式打开
base_filename = filename.split('\\')[-1] # 切分字符串获取文件名
print(base_filename,os.path.getsize(filename)) # 文件存在则打印
data_header = { # 文件的信息放入字典
'action':'put',
'filename':base_filename,
'size':os.path.getsize(filename)
}
client.send(json.dumps(data_header).encode()) # 这里json后还是字符串所以要encode编码成内存中的字符编码
for line in file_obj: # 文件头信息发送过去后再把文件内容发送过去
client.send(line)
print('发送中')
else:
print('文件不存在')
continue
elif cmd_list[0] == 'get':
pass
使用socketserver实现多并发
import json
import socket
s = socket.socket()
s.bind(('localhost',8000))
s.listen(5)
while True:
print('监听中')
conn,client_addr = s.accept()
print(conn)
print('-')
print(client_addr) # 这个是client的地址
while True:
data = conn.recv(1024)
data = json.loads(data.decode()) # 收到的json格式要解码成系统的编码
if data.get('action') is not None: # 判断发过来的头信息里面有请求类型
if data['action'] == 'put':
with open(data['filename'],'wb')as file_obj: # 定义文件名并打开文件,这里就是文新建了个件
received_size = 0 # 这个就是用来存放bytes类型的数据
while received_size < data['size']:
recv_data = conn.recv(1024) # 这里必须是从conn对象中每次接收1024的数据
file_obj.write(recv_data)
received_size += len(recv_data) # 每次接收后把数据的长度做累积
else:
print('文件接收成功')
elif data['action'] == 'get': # 这个是发送文件的
pass