在python中使用TCP将图像文件从客户端发送到服务器的程序

在python中使用TCP将图像文件从客户端发送到服务器的程序,python,sockets,Python,Sockets,这是我的密码。目前,它传输大约75%的图像文件(在底部裁剪)。我想把它作为一个整体转移。我就是这样做的: 在服务器pc中创建名为“服务器”的文件夹 在客户端pc中创建名为“客户端”的文件夹 还包括要传输到同一“客户端”文件夹中的图像文件 客户端询问“要发送的文件名”,我在文件夹中键入图像文件的名称 无论哪一方问我“您想要接收的文件名”,我都会随意输入名称 文件传输并保存到服务器PC中的“服务器”文件夹中 client.py from socket import * def establish_

这是我的密码。目前,它传输大约75%的图像文件(在底部裁剪)。我想把它作为一个整体转移。我就是这样做的:

  • 在服务器pc中创建名为“服务器”的文件夹

  • 在客户端pc中创建名为“客户端”的文件夹

  • 还包括要传输到同一“客户端”文件夹中的图像文件

  • 客户端询问“要发送的文件名”,我在文件夹中键入图像文件的名称

  • 无论哪一方问我“您想要接收的文件名”,我都会随意输入名称

  • 文件传输并保存到服务器PC中的“服务器”文件夹中

  • 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)
    
    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))
    
    server.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)
    
    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))
    

    send
    可能不会发送整个缓冲区。您需要改用
    sendall


    recv
    可能无法接收所有可用数据。您需要在一个循环中调用
    recv
    ,直到连接关闭。

    这是因为图片大于缓冲区大小。 您必须将pic表单客户端的大小发送到服务器。文本发送示例可用于将图像发送到

    如 mess=f'{len(send_message)}'.ljust(buffer_size)+send_message soc.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()
    

    嗯,您只需调用一次
    file\u data=file.read(buffer\u size)
    。如果文件大小大于缓冲区,会发生什么情况?