python - 通过 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套接字的新手,所以任何帮助将不胜感激!
(目前正试图发送燕尾服的照片......)
解决方案
我不知道文件的大小,但是在完全读取文件并分块发送数据之前,您不应该读取文件吗?
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 文件可以组合到达客户端。并且很难将两者分开。
因此,要使您的代码健壮,还有很多工作要做。
推荐阅读
- matlab - 如何从 Julia 中的字典创建结构或类型?
- r - 什么时候可以使用方括号,什么时候可以使用 $ 符号?
- mysql - SQL 列出所有重复项
- sql - 如何从表中检索所有列,但一列应在另一表中查找值(SQL-server)
- nginx - 减少 HLS 延迟会导致转码播放列表问题
- tensorflow - 将列表写入和阅读列表到 TFRecord 示例
- java - 如何从数据库中的表中删除特定项目?
- python - 无法使用 pip 安装 PyQt5
- tensorflow - tf.keras.layers.BatchNormalization:读取冻结图时出现 ValueError
- javascript - CouchDB 中图中的最短路径