前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >客户端与服务端多功能传输练手小程序

客户端与服务端多功能传输练手小程序

作者头像
小小咸鱼YwY
发布2019-07-24 16:47:26
9010
发布2019-07-24 16:47:26
举报
文章被收录于专栏:python-爬虫

客户端与服务端多功能传输小程序

server.py

代码语言:javascript
复制
from threading import Thread,Event,Lock
from concurrent.futures import  ThreadPoolExecutor
from socket import socket
from struct import pack,unpack
from json import *
import os


PATH = os.path.dirname(os.path.abspath(__file__))
SERVERPATH = os.path.join(PATH,'server')
CLIENTPATH = os.path.join(PATH,'client')
if not os.path.exists(SERVERPATH):os.mkdir(SERVERPATH)
if not os.path.exists(CLIENTPATH):os.mkdir(CLIENTPATH)


server = socket()
server.bind(('192.168.11.206',8000))
server.listen(5)

def register(conn):
    print('客户端连接到了注册程序')
    while True:
        data = loads(conn.recv(1024).decode('utf8'))
        file_path = os.path.join(PATH, f'{data[0]}.json')

        if os.path.exists(file_path):
            print('客户端注册的文件已经存在')
            conn.send('客户端注册的文件已经存在'.encode('utf8'))
            continue
        else:
            with open(file_path, 'w', encoding='utf8') as fw:
                dump(data, fw)
            print('客户端注册成功')
            conn.send('客户端注册成功'.encode('utf8'))
            break



def login(conn):
    print('客户端连接到了登入程序')
    while True:
        data = loads(conn.recv(1024).decode('utf8'))
        file_path = os.path.join(PATH, f'{data[0]}.json')

        if not os.path.exists(file_path):
            print('客户端账号不存在')
            conn.send('客户端账号不存在'.encode('utf8'))
            continue
        else:
            with open(file_path, 'r', encoding='utf8') as fr:
                if data == load(fr):
                    print('客户端登入成功')
                    conn.send('客户端登入成功'.encode('utf8'))
                    break
                else:
                    conn.send('客户端账号密码错误'.encode('utf8'))
                    continue



def download():
    print('客户端连接到了下载程序')
    while True:
        cmd = conn.recv(1024).decode('utf8')
        if cmd == 'download': conn.send(dumps((os.listdir(SERVERPATH))).encode('utf8'))

        flie_name_size = conn.recv(1024).decode('utf8')

        if flie_name_size == '服务端没有文件':
            break

        file_name = loads(flie_name_size)[0]
        file_size = loads(flie_name_size)[1]
        file_path = os.path.join(SERVERPATH, file_name)

        print(file_path)
        with open(file_path, 'rb') as fr:
            fr.seek(file_size)
            data = fr.read()
            print(data)
            conn.send(pack('i', len(data)))
            conn.send(data)
        print('服务端文件发送完毕')
        break



def run(conn):
    while True:
        try:
            print('等待客户端选择功能')
            action = conn.recv(1024).decode('utf8')
            if action == 'register':
                res = p_1.submit(register,conn)
                res.result()
            elif action == 'login':
                res =p_2.submit(login,conn)
                res.result()
            elif action == 'download':
                res =p_3.submit(download,conn)
                res.result()
            elif action == 'out':break
        except ConnectionResetError:
            print('客户端已经断开')
            break




print('服务端已经启动')
p_1 = ThreadPoolExecutor(2)
p_2 = ThreadPoolExecutor(2)
p_3 = ThreadPoolExecutor(2)
p_4 = ThreadPoolExecutor(2)
print('线程池准备完毕')
while True:
    conn,adder = server.accept()
    p_4.submit(run,conn)

client.py

代码语言:javascript
复制
from threading import Thread,Event,Lock
from socket import socket
from struct import pack,unpack
from json import loads,dumps
import os



PATH = os.path.dirname(os.path.abspath(__file__))
SERVERPATH = os.path.join(PATH,'server')
CLIENTPATH = os.path.join(PATH,'client')
if not os.path.exists(SERVERPATH):os.mkdir(SERVERPATH)
if not os.path.exists(CLIENTPATH):os.mkdir(CLIENTPATH)

client = socket()
client.connect(('192.168.11.206',8000))

def register():
    print('欢迎使用注册功能')
    while True:
        name = input('请输入你的名字')
        pwd = input('请输入你的密码')

        client.send(dumps((name, pwd)).encode('utf8'))
        data = client.recv(1024).decode('utf8')
        print(data)
        if  data == '客户端注册成功':
            print('注册成功')
            break
        else:
            print('账户已经存在')


def login():
    while True:
        name = input('请输入你的名字')
        pwd = input('请输入你的密码')

        client.send(dumps((name, pwd)).encode('utf8'))
        data = client.recv(1024).decode('utf8')
        if data =='客户端登入成功':
            print('登入成功')
            break
        else:
            print('登入失败')


def download():
    print('欢迎使用注册功能')
    while True:
        client.send('download'.encode('utf8'))
        file_lis = loads(client.recv(1024).decode('utf8'))

        for a,b in enumerate(file_lis):
            print(a,b)
        if file_lis ==[]:
            client.send('服务端没有文件'.encode('utf8'))
            print('服务端没有文件')
            break
        while True:
            file_index = int(input('请选择你要下载文件的序号'))
            try:
                file_name = file_lis[file_index]
                break
            except:
                print('好好输入')
                continue

        file_name = file_lis[file_index]
        file_path = os.path.join(CLIENTPATH,file_name)

        try:
            with open(file_path,'rb') as fr:
                file_size = len(fr.read())
        except:
            file_size = 0


        client.send(dumps((file_name,file_size)).encode('utf8'))

        size = unpack('i',client.recv(4))[0]

        print(size)

        while file_size != size:
            data = client.recv(1024)
            with open(file_path,'ab') as fa:
                fa.write(data)
            with open(file_path, 'rb') as fr:
                file_size = len(fr.read())
                print(file_size)

        print('下载完成')
        break


def run():
    while True:
        msg = '''
        输入0 注册功能
        输入1 登入功能
        输入2 下载功能
        输入Q 退出
        '''

        print(msg)
        chiose = input('请选择你要要运行的程序')

        if chiose == 'Q':client.send('out'.encode('utf8'));print('程序退出');break
        elif chiose == '0':client.send('register'.encode('utf8'));register()
        elif chiose == '1':client.send('login'.encode('utf8'));login()
        elif chiose == '2':client.send('download'.encode('utf8'));download()
        else:print('好好输入');continue

if __name__ == '__main__':
    run()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-07-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 客户端与服务端多功能传输小程序
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档