zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    骗子网站,X毛都没有,骗我九十九
    xssgame挑战wp
    某xss挑战赛闯关笔记
    committed与urgent的区别
    KahnProcessNetwork的Python实现
    网络层数
    使用matlab用优化后的梯度下降法求解达最小值时参数
    使用matlab画半透明椭圆
    关系代数(Relation Algebra)与SQL语句的对应关系
    one vs all -- 将01分类器用于多类分类问题
  • 原文地址:https://www.cnblogs.com/shizhengquan/p/10900980.html
Copyright © 2011-2022 走看看