套接字实现客户和服务端连接进行发送消息

客户端

from socket import *
import sys

from util import send_data, start_data


def _output(sock):
    def _input():
        msg = input('>>')
        if msg == "emd":
            print("客户端结束连接")
            sock.send(msg.encode('utf8'))
            sys.exit(1)
        elif msg == "请接收我的精美图片":
            sock.send(msg.encode('utf8'))
        elif msg == "请为我分析成绩单,我需要了解最高成绩。最低成绩,平均成绩,高于平均成绩的同学有哪些":
            sock.send(msg.encode('utf8'))
        else:
            sock.send(msg.encode('utf8'))

    while True:
        connex = sock.recv(1024).decode('utf-8')
        print("魔品: ", connex)
        if connex == "好的":
            msg = input('请输入您的图片路径:')
            sock.send('图片发送成功'.encode('utf-8'))
            send_data(sock, _path=msg)
        elif connex == "感谢你提供的精美图片,我也有惊喜送给你,请接受我的视须问候":
            msg = input('>>>')
            sock.send(msg.encode('utf-8'))
        elif connex == 'B.mp4发送成功':
            start_data(sock, _form="server_")
        elif connex == "请发送成绩单":
            msg = input('请输入您的文件路径:')
            sock.send('文件发送成功'.encode('utf-8'))
            send_data(sock, _path=msg)
        elif connex[: 10] == "你好,成绩分析己完成":
            sock.send('谢谢魔品,你真是我的好帮手'.encode('utf-8'))
        else:
            _input()


def main():
    client_socket = socket(AF_INET, SOCK_STREAM)
    client_socket.connect(('localhost', 8899))
    client_socket.send('你好,我叫zss'.encode('utf-8'))
    _output(client_socket)


if __name__ == '__main__':
    main()

服务端

from socket import *
from threading import Thread

from main import analysis_data
from util import start_data, send_data

_msg = {
    "请接收我的精美图片": "好的",
    "请为我分析成绩单,我需要了解最高成绩。最低成绩,平均成绩,高于平均成绩的同学有哪些": "请发送成绩单",
    "谢谢魔品,你真是我的好帮手": "不客气哦"
}


def _input(sock, connex):
    if connex == '图片发送成功':
        start_data(sock, _form="client_")
    elif connex == "好的":
        sock.send('B.mp4发送成功'.encode('utf-8'))
        send_data(sock, _path="file_server/B.mp4")
    elif connex == "文件发送成功":
        data = start_data(sock, _form="")
        performance = analysis_data(data)
        sock.send(performance.encode('utf-8'))
    else:
        if connex in _msg.keys():
            sock.send(_msg.get(connex).encode('utf-8'))
        else:
            data = "你好,我是你的程能聊天伙伴,我叫魔品"
            sock.send(data.encode('utf-8'))


def _output(client_conn, client_file):
    print(f'用户连接{client_conn},端口{client_file}')
    while True:
        connex = client_conn.recv(1024).decode('utf-8')
        print('客户端: ', connex)
        if connex == "emd":
            connex.close()
            break
        else:
            _input(client_conn, connex)


def main():
    with socket(AF_INET, SOCK_STREAM) as sock:
        sock.bind(('localhost', 8899))
        sock.listen(5)
        print("服务端 等待连接,端口:", 8899)
        while True:
            client_conn, client_file = sock.accept()
            thread = Thread(target=_output, args=(client_conn, client_file, ))
            thread.start()
            thread.join()


if __name__ == '__main__':
    main()

压缩文件解压文件

import os
import struct


def send_data(sock, _path):
    head = struct.pack(b'128sq',
                       bytes(os.path.basename(_path),
                             encoding='utf-8'),
                       os.stat(_path).st_size)
    sock.send(head)
    with open(_path, 'rb') as f:
        while True:
            data = f.read(1024)
            if data:
                sock.send(data)
            else:
                break


def start_data(sock, _form):
    new_file_name = None
    while True:
        new_file_size = struct.calcsize('128sq')
        new = sock.recv(new_file_size)
        if new:
            file_name, file_size = struct.unpack('128sq', new)
            file_name = file_name.decode().strip('\x00')
            if file_name == "B.mp4":
                new_file_name = os.path.join('C.mp4')
            else:
                new_file_name = os.path.join('from_' + _form + file_name)

            size = 0
            with open(new_file_name, 'wb') as f:
                while not file_size == size:
                    if file_size - size > 1024:
                        data = sock.recv(1024)
                        size += len(data)
                    else:
                        data = sock.recv(1024)
                        size = file_size
                    f.write(data)
        break

    if _form == 'server_':
        print("###解压成功###  server ------> client")
        data = "谢谢你的礼物,我会收藏起来的"
        sock.send(data.encode('utf-8'))
    elif _form == 'client_':
        print("###解压成功###  client ------> server")
        data = "感谢你提供的精美图片,我也有惊喜送给你,请接受我的视须问候"
        sock.send(data.encode('utf-8'))
    return new_file_name

数据分析

import re


class Analysis(object):
    def __init__(self, _post):
        with open(_post, 'r', encoding="utf-8") as f:
            self.list_data = re.sub('分', '', f.read()).strip().split(',')
            self.score = [int(i.split(':')[1].strip()) for i in self.list_data]
            self.name = [i.split(':')[0].strip() for i in self.list_data]
            self.avg = sum(self.score) / len(self.score)
            self.max = max(self.score)
            self.min = min(self.score)
            self.list_zip = list(zip(self.name, self.score))
            self.list_sorted = list(sorted(self.list_zip, key=lambda x: x[1], reverse=True))
            self.list_filter = list(filter(lambda x: x[1] > self.avg, self.list_zip))

    def result(self):
        print('分数排序', self.list_sorted)
        return "你好,成绩分析己完成如下请您参考:最高成绩:%s分。最低成绩:%s分,平均成绩:%s分,高于平均成绩的同学有:%s"\
            % (self.max, self.min, self.avg, self.list_filter)


def analysis_data(_post):
    analysis = Analysis(_post=_post)
    return analysis.result()

装饰器

def decorator_with_parameters(parameter):
    def decorator(func):
        def wrapper(*args, **kwargs):
            # 执行装饰器前的逻辑
            print(f"装饰器参数: {parameter}")
            result = func(*args, **kwargs)
            # 执行装饰器后的逻辑
            return result
        return wrapper
    return decorator


@decorator_with_parameters("参数值")
def decorated_function():
    print("被装饰的函数")

# 调用被装饰的函数
decorated_function()

迭代器

 class Iterator:
#     def __init__(self, data):
#         self.data = data
#         self.index = 0
# 
#     def __iter__(self):
#         return self
# 
#     def __next__(self):
#         while self.index < len(self.data):
#             num = self.data[self.index]
#             self.index += 1
#             return num
#         raise StopIteration
# 
# 
# if __name__ == '__main__':
#     my_iterator = Iterator('123456')
#     for i in my_iterator:
#         print(i)

生成器

def number_generator(n):
    for i in range(n):
        yield i

# 创建生成器对象
my_generator = number_generator(5)

# 使用生成器产生值
print(next(my_generator))  # 输出: 0
print(next(my_generator))  # 输出: 1
print(next(my_generator))  # 输出: 2
print(next(my_generator))  # 输出: 3
print(next(my_generator))  # 输出: 4

面向对象编程,封装继承多态

# 封装
class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        pass

# 继承
class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

# 多态
def animal_speak(animal):
    print(animal.speak())

dog = Dog("Buddy")
cat = Cat("Whiskers")

animal_speak(dog)  # 输出: Woof!
animal_speak(cat)  # 输出: Meow!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值