多线程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()