【发布时间】:2016-12-10 13:21:30
【问题描述】:
我想将服务器的屏幕截图发送给客户端,为了做到这一点,我想将图像作为字节发送,并将其拆分为多个部分,每个部分的长度为 1024。
首先,程序做了很多事情,它还发送文件、时间等。所以客户端需要告诉服务器他/(它)?想要一个图像,所以他首先发送'Img',然后服务器返回'Img',当客户端收到'Img'时,他开始监听所有部分,服务器开始发送所有部分,当最后一部分发送,服务器发送'Sent'。
到目前为止我的代码:Client.py:
def listen_for_image():
bytes_data = socket_con.recv(1024)
part = bytes_data
i = 1
print("Part #", str(i))
while part.decode() != 'Sent':
part = socket_con.recv(1024)
bytes_data += part
i += 1
print("Part #", str(i))
return bytes_data
socket_con.send('Img')
data_back = socket_con.recv(1024)
if data_back.decode() == 'Img':
bytes_full_data = listen_for_image()
img = Image.frombytes('RGB', (1366, 768), bytes_full_data)
img.save('newimg.jpg')
Server.py:
def send_screen_shot():
con.send('Img'.encode())
image = ImageGrab.grab()
start = 0
end = 1024
while end < len(image.tobytes()):
con.send(image.tobytes()[start:end])
start = end + 1
end += 1024
con.send("Sent".encode())
if con.recv(1024).decode() == 'Img':
send_screen_shot()
请注意,我的程序做得更多,所以这不是完整的代码,只是需要的部分,如果您需要其他内容,请询问:)
我的代码的问题是在客户端出现错误:
Traceback (most recent call last):
File "C:/Users/dodob/PycharmProjects/untitled/client.py", line 33, in <module>
bytes_full_data = listen_for_image()
File "C:/Users/dodob/PycharmProjects/untitled/client.py", line 14, in listen_for_image
while part.decode() != 'Sent':
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
编辑: 我尝试切换编码器来解决这个问题,例如:
Client.py:
def listen_for_image():
bytes_data = socket_con.recv(1024)
part = bytes_data
i = 1
print("Part #", str(i))
while part.decode('ISO-8859-1') != 'Sent':
part = socket_con.recv(1024)
bytes_data += part
i += 1
print("Part #", str(i))
return bytes_data
Server.py:
def send_screen_shot():
con.send('Img'.encode())
image = ImageGrab.grab()
start = 0
end = 1024
while end < len(image.tobytes()):
con.send(image.tobytes(encoder_name='ISO-8859-1')[start:end])
start = end + 1
end += 1024
con.send("Sent".encode('ISO-8859-1'))
然后我在服务器端收到错误:
Traceback (most recent call last):
File "C:\Python\Python35\lib\site-packages\PIL\Image.py", line 437, in _getencoder
encoder = getattr(core, encoder_name + "_encoder")
AttributeError: module 'PIL._imaging' has no attribute 'ISO-8859-2_encoder'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:/Users/dodob/PycharmProjects/untitled/server.py", line 42, in <module>
send_screen_shot()
File "C:/Users/dodob/PycharmProjects/untitled/server.py", line 19, in send_screen_shot
con.send(image.tobytes(encoder_name='ISO-8859-2')[start:end])
File "C:\Python\Python35\lib\site-packages\PIL\Image.py", line 681, in tobytes
e = _getencoder(self.mode, encoder_name, args)
File "C:\Python\Python35\lib\site-packages\PIL\Image.py", line 441, in _getencoder
raise IOError("encoder %s not available" % encoder_name)
OSError: encoder ISO-8859-2 not available
客户端一直这样运行:
...
Part # 2376824
Part # 2376825
Part # 2376826
Part # 2376827
Part # 2376828
Part # 2376829
Part # 2376830
Part # 2376831
Part # 2376832
Part # 2376833
Part # 2376834
...
我认为这个错误是因为没有这样的编码器但我尝试了多个编码器并且每次都会发生..但无论如何,我不知道为什么客户端继续运行,recv 函数应该停止直到它收到一些东西,在这里它永远运行。
感谢您的帮助。
【问题讨论】:
标签: python python-3.x sockets