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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。