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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355