python - 在 Socket Python 上发送图片
问题描述
我目前正在做一个项目,我需要通过 Python 将照片发送到另一台计算机。我正在使用模块 Socket,但是当我尝试发送照片时,我收到一条错误消息,提示“发送到数据报套接字的消息大于内部消息缓冲区或另一个网络边界,或者用于接收数据报的缓冲区是小于数据报本身”我该如何解决?谢谢
解决方案
您的图像太大,无法在一个 UDP 数据包中发送。您需要将图像数据拆分为多个单独发送的数据包。socket.SOCK_STREAM 而不是 socket.SOCK_DGRAM。在那里,您不必担心数据包大小和排序。虽然你需要设置buffer_size。
import random
import socket, select
from time import gmtime, strftime
from random import randint
imgcounter = 1
basename = "image%s.png"
HOST = '127.0.0.1'
PORT = 6666
connected_clients_sockets = []
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((HOST, PORT))
server_socket.listen(10)
connected_clients_sockets.append(server_socket)
buffer_size = 4096
while True:
read_sockets, write_sockets, error_sockets = select.select(connected_clients_sockets, [], [])
for sock in read_sockets:
if sock == server_socket:
sockfd, client_address = server_socket.accept()
connected_clients_sockets.append(sockfd)
else:
try:
print ' Buffer size is %s' % buffer_size
data = sock.recv(buffer_size)
txt = str(data)
if txt.startswith('SIZE'):
tmp = txt.split()
size = int(tmp[1])
print 'got size'
print 'size is %s' % size
sock.send("GOT SIZE")
# Now set the buffer size for the image
buffer_size = 40960000
elif txt.startswith('BYE'):
sock.shutdown()
elif data:
myfile = open(basename % imgcounter, 'wb')
# data = sock.recv(buffer_size)
if not data:
myfile.close()
break
myfile.write(data)
myfile.close()
sock.send("GOT IMAGE")
buffer_size = 4096
sock.shutdown()
except:
sock.close()
connected_clients_sockets.remove(sock)
continue
imgcounter += 1
server_socket.close()
推荐阅读
- django - 不要将当前值放在表单中
- python - 用替换求解for循环中的单个(非线性)方程?
- reactjs - 无法在带有 typescript react.js 项目的 electron.js 中的模块外部使用 import 语句
- exchangelib - ews 收件箱的条件计数 - exchangelib 查询
- c# - Blazor 使用 IDisposable 清除内存
- opengl - GlutSolidCube 透明度
- excel - 如何在内置函数中使用 IF 语句
- python - 在 pythonanywhere 中为非英语语言使用 pytesseract ocr
- python - 随机森林:如何获得训练精度以与测试精度进行比较
- reactjs - 加载图像提要的最有效方式(在加载时间和带宽方面)是什么?