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