Программа для отправки файла изображения с клиента на сервер в python с использованием TCP - PullRequest
0 голосов
/ 18 февраля 2020

Это мой код. В настоящее время он передает около 75% файла изображения (обрезается внизу). Я хочу, чтобы это перенесли в целом. Вот как я работал над этим:

  1. Создать папку на сервере p c под названием "сервер"

  2. Создать папка в клиенте p c называется "клиент"

  3. Также включите файл изображения, который вы хотите перенести в ту же папку "клиент"

  4. Клиентская сторона спрашивает "имя файла, который вы хотите отправить", я набираю имя файла изображения в папке

  5. Aerver сторона спрашивает меня "имя файла, который вы хотите чтобы получить ", я набираю произвольное имя.

  6. Файл передается и сохраняется в папке" server "на сервере P C.

client.py

from socket import *

def establish_connection(server_IP, server_port):
    client_socket = socket(AF_INET, SOCK_STREAM)
    client_socket.connect((server_IP, server_port))
    return client_socket

def send_recv_message(client_socket, message, buffer_size):
    file = open(filename,'rb')
    file_data = file.read(buffer_size)
    client_socket.send(file_data)
    text=print("File transfered")
    return text



server_IP = input("Please, enter server IP address: ")
server_port = input("Please, enter server TCP connection port number: ")
client_socket = establish_connection(server_IP, int(server_port))
print("Connection established\n")



filename= input(str("enter filename"))

received_message = send_recv_message(client_socket,filename,1048576)

server.py

from socket import *

def create_socket(server_port):
    server_socket = socket(AF_INET, SOCK_STREAM)
    server_socket.bind(('', server_port))
    server_socket.listen(1)
    return server_socket


def recv_message(server_socket, buffer_size):
    file = open(filename, 'wb')
    connection_socket, address = server_socket.accept()
    file_data= connection_socket.recv(buffer_size)
    file.write(file_data)
    file.close()
    text=("file recieved")
    return text


server_port = input("Please, enter TCP connection port number: ")
server_socket = create_socket(int(server_port))

while (True):
    filename=input(str("enter filename for the incoming file:"))
    incoming_message = recv_message(server_socket,  1048576)
    print ("{}" .format(incoming_message))

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

это потому, что изображение больше размера буфера. Вы должны отправить размер клиента формы pi c на сервер. Например, для отправки текста это можно использовать для изображения ...

например

 send_message = input()

mess = f '{len (send_message)}'. ljust (buffer_size) + send_message, так что c .send (mess.encode ())

на стороне сервера найдите размер изображения, а размер не равен к полученному сообщению добавляйте сообщение.

  message = ''
    mes_len = 0
    new_msg = True
    print('got the connection: {}'.format(self.request))
    while True:
        data = self.request.recv(buffer_size)
        if new_msg:
            mes_len = int(data.decode())
            new_msg = False
        message += data.decode()
0 голосов
/ 18 февраля 2020

send может не отправлять весь буфер. Вместо этого вам нужно использовать sendall.

recv может не получить все доступные данные. Вам нужно звонить recv по всем oop, пока соединение не будет закрыто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...