首页 > 解决方案 > 通过 python 套接字发送 png 文件

问题描述

我已经在 Python 中设置了一个带有套接字的 python 客户端和服务器,它允许服务器向客户端发送文本,并且我一直在尝试扩展它,以便可以将图像发送到客户端。

服务器代码:

import socket

#setup and bind server socket
s_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#setup socket
s_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)#reuses same port (allows reconnection)
s_socket.bind(('192.168.178.52', 9001))

s_socket.listen(1)

#connects and prints clients data and send message
clientsocket, address = s_socket.accept()
print('Connection from {}'.format(address))
clientsocket.send(bytes('Welcome to the server', 'utf-8'))

#Loops for server to sent text data to client


while True:
    m = input('Enter')
    try:
        file = open(m, 'rb')
        b = file.read(2048)
        clientsocket.send(b)
    except:
        clientsocket.send(bytes(m, 'utf-8'))

客户端代码:

import socket
import webbrowser
import os
import pyautogui

#setup and bind client socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.connect(('----------', 9001))#ip swapped for post

while True:
    message = s.recv(2048)#recieves all messages sent with buffer size
    if message:
        txt = str(message)
        with open('plswork.png', 'wb') as file:
            file.write(message)
            file.close()

我遇到的问题是它会发送文件并完美地创建它,但是当我打开它时只有部分图像会加载(见图)我很确定这与缓冲区大小有关但是,当我增加它时,它根本无法识别该文件,并且尝试打开照片时会出错(最好您可以发送大多数照片)。python套接字的新手,所以任何帮助将不胜感激!

(目前正试图发送燕尾服的照片......)

https://i.stack.imgur.com/lBblq.png

标签: pythonpython-3.xsocketspngpython-sockets

解决方案


我不知道文件的大小,但是在完全读取文件并分块发送数据之前,您不应该读取文件吗?

while True:
    m = input('Enter')
    try:
        file = open(m, 'rb')
        while True:
            b = file.read(2048)
            if not b:
                break
            clientsocket.send(b)
    except:
        clientsocket.send(bytes(m, 'utf-8'))

客户端也必须进行调整。

大多数网络协议添加更多信息以简化接收。

例如,如果您首先发送欢迎消息包含的字节数,然后是欢迎消息,然后是一些指示符,您将发送一个文件,然后是一些信息,您将发送多少字节,这可能是一个好主意对于图像,然后是图像的字节

您还会发现,客户端要知道什么是文本消息以及什么是 png 文件的一部分是很复杂的。

事实上,如果您input()从服务器中删除命令并硬编码文件名,您可能会注意到。欢迎消息和 png 文件可以组合到达客户端。并且很难将两者分开。

因此,要使您的代码健壮,还有很多工作要做。


推荐阅读