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