2019-08-14_Work_Day18

pythonCS发送与接收信息

Server:
# -*- coding: utf-8 -*-
"""
@project:   day18-网络编程
@file:      workServer.py
@author:    lis_break
@time:      2019-08-14 16:26:34
"""
from socket import *
import time
import os
import re
import json


class MessageServer:
    SERVER_IP = '127.0.0.1'
    # SERVER_IP = '10.7.181.116'
    SERVER_PORT = 8888
    MAX_LISTEN = 512
    __FILES_PATH = 'files/'

    def __init__(self):
        self.server = socket()
        self.__init()

    def __init(self):
        """初始化server"""
        self.server.bind((MessageServer.SERVER_IP, MessageServer.SERVER_PORT))
        self.server.listen(MessageServer.MAX_LISTEN)

    def listening(self):
        """server监听"""
        while True:
            print('服务器开始监听...')
            connect, address = self.server.accept()
            print('与{}建立连接...'.format(address[0]))
            while True:
                recv_data = connect.recv(1024).decode(encoding='utf-8')
                # print('接收:{}'.format(recv_data))
                if recv_data == 'a':
                    MessageServer.__send_text(connect, address)
                elif recv_data == 'b':
                    while True:
                        flag = MessageServer.__send_image(connect)
                        if flag:
                            break
                elif recv_data == 'c':
                    # client断开连接标志
                    print('{}断开连接...'.format(address[0]))
                    break
                else:
                    break
            connect.close()

    @staticmethod
    def __send_text(connect: socket, address: tuple):
        """发送文字信息"""
        connect.send('服务器端:{}:{}\n客户端:{}:{}\ntime:{}'.
                     format(MessageServer.SERVER_IP, MessageServer.SERVER_PORT,
                            address[0], address[1],
                            time.strftime('%Y-%m-%d_%H:%M:%S', time.localtime(time.time()))).encode())

    @staticmethod
    def __get_images_info():
        """获取文件路径下的图片"""
        files = os.listdir(MessageServer.__FILES_PATH)
        print(files)
        # [a - zA - Z\d_\u4e00 -\u9fa5]
        image_files = re.finditer(r'[a-zA-Z\d_\u4e00-\u9fa5()-]+\.(gif|jpg|jpeg|bmp|png)', str(files)[1:-1])
        image_list = list(image.group() for image in image_files)
        # print(image_list)
        return image_list

    @staticmethod
    def __send_image(connect: socket):
        # 发送图片
        # 获取图片名
        images = MessageServer.__get_images_info()
        # 以json格式发送
        connect.send((json.dumps(images)).encode())
        # connect.send(str(images).encode())
        index = connect.recv(1024).decode(encoding='utf-8')
        # 发送图片
        # 判断图片序号
        if not 0 <= int(index) < len(images):
            connect.send('FAILED'.encode())
            return False
        send_image = images[int(index)]
        connect.send('{}'.format(send_image).encode())
        with open('{}{}'.format(MessageServer.__FILES_PATH, send_image), 'br') as f:
            connect.send(f.read())
        return True


def main():
    server = MessageServer()
    server.listening()


if __name__ == '__main__':
    main()

Client:
# -*- coding: utf-8 -*-
"""
@project:   day18-网络编程
@file:      workClient.py
@author:    lis_break
@time:      2019-08-14 16:26:43
"""
from workServer import *


class MessageClient:
    DOWNLOAD_PATH = 'download/'
    BUF_SIZE = 1024

    def __init__(self, server_ip: str, server_port: int):
        self.client = socket()
        self.client.connect((server_ip, server_port))

    def connecting(self):
        while True:
            # 发送消息
            print('=' * 30)
            message = input('客户端:\na.请求文字信息\nb.请求图片信息\nc.退出\n请选择(a~c):')
            print('=' * 30)
            self.client.send(message.encode())
            if message == 'a':
                re_data = self.client.recv(MessageClient.BUF_SIZE).decode(encoding='utf-8')
                print('客户端接收:\n{}\n{}\n{}'.format('=' * 30, re_data, '=' * 30))
            elif message == 'b':
                while True:
                    file_path = self.__to_load_image()
                    if file_path:
                        print('下载成功!')
                        break
                # 下载图片
                self.__download_image(file_path)
            elif message == 'c':
                break
        self.client.close()

    def __to_load_image(self):
        """向服务器申请下载图片,获取文件路径"""
        re_data = self.client.recv(MessageClient.BUF_SIZE).decode(encoding='utf-8')
        # json转换列表
        re_data = eval(re_data)
        print('客户端接收:\n{}\n{}'.format('=' * 30, '序号\t\t文件名'))
        for index in range(len(re_data)):
            print('{}\t\t{}'.format(index, re_data[index]))
        print('=' * 30)
        index = input('请选择想要下载的图片序号:')
        self.client.send(index.encode())
        image_name = self.client.recv(MessageClient.BUF_SIZE).decode(encoding='utf-8')
        # print(recv_message)
        if image_name == 'FAILED':
            print('输入序号错误,请重试!')
            return
        file_path = '{}{}__{}'.format(MessageClient.DOWNLOAD_PATH,
                                      time.strftime('%Y-%m-%d_%H:%M:%S', time.localtime(time.time())),
                                      image_name)
        return file_path

    def __download_image(self, path: str):
        """下载图片"""
        with open(path, 'wb') as f:
            while True:
                recv_data = self.client.recv(MessageClient.BUF_SIZE)
                f.write(recv_data)
                if len(recv_data) < MessageClient.BUF_SIZE:
                    break


def main():
    client = MessageClient(MessageServer.SERVER_IP, MessageServer.SERVER_PORT)
    client.connecting()


if __name__ == '__main__':
    main()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容