2019-08-15_Work_Day19

多线程CS信息/文件传递

MessageServer.py
# -*- coding: utf-8 -*-
"""
@project:   day19-http协议与多线程基础
@file:      MessageServer.py
@author:    lis_break
@time:      2019-08-15 16:28:45
"""
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 = 8889
   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)

   @staticmethod
   def listening(connect, address):
      """server监听"""
      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():
      """获取文件路径下的图片"""
      split_char = '\u00f1'
      files = os.listdir(MessageServer.FILES_PATH)
      files = ''.join([split_char + split_char.join(files) + split_char])
      # print(files)
      # [a - zA - Z\d_\u4e00 -\u9fa5]
      image_files = re.finditer(r'[^\u00f1]+\.(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)]
      # print(send_image)
      connect.send('{}'.format(send_image).encode())
      with open('{}{}'.format(MessageServer.FILES_PATH, send_image), 'br') as f:
         connect.send(f.read())
      return True
MessageClient.py
# -*- coding: utf-8 -*-
"""
@project:   day19-http协议与多线程基础
@file:      MessageClient.py
@author:    lis_break
@time:      2019-08-15 16:34:25
"""
from MessageServer 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()
ServerThread.py
# -*- coding: utf-8 -*-
"""
@project:   day19-http协议与多线程基础
@file:      ServerThread.py
@author:    lis_break
@time:      2019-08-15 16:24:57
"""
from threading import *
from MessageServer import *


class ServerThread(Thread):
   server = MessageServer()

   def __init__(self, connection: socket, address: str):
      super().__init__()
      self.connection = connection
      self.address = address

   def run(self) -> None:
      ServerThread.server.listening(self.connection, self.address)

   @staticmethod
   def create_server():
      print('服务器开始监听...')
      while True:
         connect, address = ServerThread.server.server.accept()
         t = ServerThread(connect, address)
         t.start()


def main():
   ServerThread.create_server()


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

相关阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 6,348评论 0 10
  • Python的面向对象 类 Class 类变量 Class variable 数据成员 Data member 函...
    JasonJe阅读 1,283评论 0 3
  • 必备的理论基础 1.操作系统作用: 隐藏丑陋复杂的硬件接口,提供良好的抽象接口。 管理调度进程,并将多个进程对硬件...
    drfung阅读 3,771评论 0 5
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,992评论 0 9
  • 0813晨间日记【6/90】: 1.早起5:11 晚睡10:32 2.昨日反思: ①完成创业计划书, 没有完成,...
    六两在路上阅读 149评论 0 0

友情链接更多精彩内容