专栏首页python-爬虫客户端与服务端多功能传输练手小程序

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

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

server.py

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

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()

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于__new__和__init__

    小小咸鱼YwY
  • DJango错误日志生成

    小小咸鱼YwY
  • 数据类型补充

    另外还有一种未被提到的数据类型为虚数complex在python中虚数为5j来表示

    小小咸鱼YwY
  • Python提取PDF第一页为封面图片【批量提取】

    近期要处理一批PDF文件,大约在20G,具体数量不详,需求是把每个文件的页数和第一页转换成图片,在网上查阅各种类库,最终选择的是PyMuPDF模块。最后核心代码...

    申霖
  • 比男友更了解你的穿搭喜好,这个模型可以陪你挑衣服 | 论文

    安妮 编译自 arXiv 量子位 出品 | 公众号 QbitAI 购物网站总想通过推荐系统让你多买几件衣服。 但穿搭可是个不太好把控的东西,复杂的服装风格不仅让...

    量子位
  • 小甲鱼《零基础学习Python》课后笔记(三十五):图形用户界面入门——EasyGui

    1.实现一个用于登记用户账号信息的界面(如果是带*号的必填项,要求一定要有输入并且不能是空格)。

    小火柴棒
  • CSS Feature Query

    与media query(媒体查询)类似,feature query(特性查询)也是一种条件样式,仅在支持特定样式规则的环境应用指定的一组样式:

    ayqy贾杰
  • HTML第二课——css

    用户2149234
  • Python入门之获取当前所在目录的方法详解

    #本文给大家讲解的是使用python获取当前所在目录的方法以及相关示例,非常的清晰简单,有需要的小伙伴可以参考下 sys.path 模块搜索路径的字符串列表。由...

    Jetpropelledsnake21
  • python文件操作

    要用python操作文件,首先就是要获取要操作文件的路径,获取路径常见的函数为dirname、path、getcwd,首先就来介绍这几个函数的不同之处

    听城

扫码关注云+社区

领取腾讯云代金券