Как в эхо сервер, который пересылает текст добавить пересылку файлов и картинок?

Написал простой эхо сервер и клиент

Сервер:

import socket
import logging
import threading

HEADER = 1024
HOST = 'localhost'
PORT = 5005
ADDR = (HOST, PORT)
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADDR)


def handle_client(conn, addr):
    print(f'[NEW CONNECTION] {addr}')
    connected = True
    while connected:
        data = conn.recv(HEADER)
        if not data:
            break
        conn.sendall(data)


def start():
    server.listen(1)
    while True:
        conn, addr = server.accept()
        thread = threading.Thread(target=handle_client, args=(conn, addr))
        thread.start()
        print(f'[ACTIVE CONNECTRED] {threading.activeCount() -1 }')

start()

Клиент:

import socket

HOST = 'localhost'
PORT = 5005


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
print('Client connected.')
while True:
    user_input = str(input())
    if not user_input:
        break
    s.sendall(user_input.encode())
    data = s.recv(1024)
    if not data:
        break
    print("Data received")

Как сделать так, что бы можно было принимать (до этого отправлять их с клиента) кроме текста еще файлы и картинки и отправлять их обратно на клиент? Ведь нас на сторону сервера поступают байты. Как определить что это именно файл, а не текст, когда ему приходят байты. Помогите с написанием кода.


Ответы (1 шт):

Автор решения: Mango

я когда передавал изображение я его переделывал в байты

import os, base64, io, PIL
user_input = str(input())
if user_input.startswith('C:\\'): #если  user_input это какой то путь
    if os.path.isfile(user_input): #если  user_input это действительная картинка  
        data = base64.b64encode(open(user_input, 'rb').read()) #картинка  в байты
        s.sendall(bytes(data))

из байтов в картинку

Image.open(io.BytesIO(base64.b64decode(server.recv(4096).decode()))).save('ваш путь для сохранения')
→ Ссылка