![](/img/trans.png)
[英]Sending an Image from Client to Server using Sockets in Python
[英]Sending an image from client to server via sockets
我制作了一个TCP服务器和一个客户端,当服务器请求命令并接收“屏幕截图”时,客户端将获取该数据并通过图像作为字节对象发送,但是当我尝试执行.frombytes()并下载并显示时它给我一个错误,即“图像数据不足”。
我试图增加缓冲区下载它。
服务器
import socket
from PIL import Image
class Server:
def __init__(self, host, port):
self.host = host
self.port = port
self.clients = []
def start(self):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((self.host, self.port))
# backlog == how many connections we can have
server.listen(1)
while True:
client, addr = server.accept()
# Send our command to the client
message = input("What is your command? ")
client.send(message.encode(encoding="utf-8"))
# Receive our data and check what to do with it.
succesful_screenshot = client.recv(4096).decode(encoding="utf-8")
if succesful_screenshot == "returnedScreenshot":
client.settimeout(5.0)
screenshot = client.recv(4096)
img = Image.frombytes(data=screenshot, size=(500, 500), mode="RGB")
img.show()
print("hit this")
if __name__ == '__main__':
Server(host='localhost', port=10000).start()
客户
import socket
from PIL import ImageGrab
class Client:
def __init__(self, host, port):
self.host = host
self.port = port
def start(self):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.connect((self.host, self.port))
while True:
data = server.recv(4096)
decoded_data = data.decode(encoding="utf-8")
if decoded_data == "screenshot":
# If we receive a string from the server which equals "screenshot" then we grab a screenshot
# We turn that screenshot into a byte object which we send back to the server and then we decrypt there.
img = ImageGrab.grab()
bytes_img = img.tobytes()
# Send that we have taken a screenshot
server.send("returnedScreenshot".encode("utf-8"))
# Send the screenshot over.
server.send(bytes_img)
if __name__ == '__main__':
Client(host='localhost', port=10000).start()
错误
Traceback (most recent call last):
File "C:/Users/Kaihan/PycharmProjects/Networking/demo/server.py", line 38, in <module>
Server(host='localhost', port=10000).start()
File "C:/Users/Kaihan/PycharmProjects/Networking/demo/server.py", line 32, in start
img = Image.frombytes(data=screenshot, size=(500, 500), mode="RGB")
File "C:\Users\Kaihan\AppData\Local\Programs\Python\Python36\lib\site-packages\PIL\Image.py", line 2412, in frombytes
im.frombytes(data, decoder_name, args)
File "C:\Users\Kaihan\AppData\Local\Programs\Python\Python36\lib\site-packages\PIL\Image.py", line 815, in frombytes
raise ValueError("not enough image data")
ValueError: not enough image data
在Server.start
您可以执行以下操作: screenshot = client.recv(4096)
。 但是您不能确定:
这正是PIL
告诉您的:“没有足够的图像数据”,这意味着您没有读取足够的数据。
您应该确保阅读了客户端发送的所有内容。 尝试将screenshot = client.recv(4096)
替换为以下内容:
screenshot = b""
chunk = client.recv(4096)
while chunk:
screenshot += chunk
chunk = client.recv(4096)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.