我正在寻找一个非常基本的远程桌面应用程序。现在我能够使用 python win32 API 捕获屏幕数据,并且能够通过套接字连接发送一个图像,并在接收端正确重建它。在发送实际图像数据之前,我发送图像的大小和一些其他编码为 11 字节字符串的数据。我遇到的问题是当我尝试发送第二个 11 字符串时。简单地说,没有数据通过套接字。客户端发送数据,打印出一些确认其进度的信息,然后关闭。但在服务器端,没有数据通过套接字。我不确定发生了什么。
这是我的代码,注释:
客户端:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 8888))
imgLength = sys.getsizeof(bmpstr) ## bmpstr is the pixel data
prefix = str(imgLength) # message length
prefixSize = sys.getsizeof(prefix)
if prefixSize < 30:
prefix = ('0' * (30 - prefixSize)) + prefix
prefix = "5" + "1" + prefix ## BLOCK LOCATION
s.send(prefix.encode("UTF-8"))
totalSent = 0
while totalSent < imgLength:
totalSent += 4096
if (totalSent >= imgLength):
s.send(bmpstr[totalSent :])
break
else:
s.send(bmpstr[totalSent : totalSent + 4096])
现在我只需运行两次,以相同的方式发送前缀和像素数据。它的字面意思是复制和粘贴。我不关闭 socket ,我对两个图像使用相同的连接。我想知道这是否是我的问题?我希望有一些实时的数据传输,可能是 3-4 FPS,所以我想尽可能高效地做到这一点。
服务器端:
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 8888))
serversocket.listen(5)
transmission = clientsocket.recv(4096)
transmissionMetaData = decode_meta_data(transmission)
transmissionLength = transmissionMetaData[0]
blockX = transmissionMetaData[1]
blockY = transmissionMetaData[2]
while 1:
thisData = clientsocket.recv(4096)
data += thisData
if len(data) >= transmissionLength or not(thisData):
break
## rebuild the image...
# prepare for second image
data = ""
transmission = ""
prefixTransmission = ""
## here is the problem, I am trying to receive the prefix data which will contain
# the size of the second transmission. But for some reason this never gets any data
# it works just fine when i do it above.
while 1:
thisData = clientsocket.recv(4096)
prefixTransmission += thisData
### this line always prints an empty string for the data
print sys.getsizeof(prefixTransmission), " :", prefixTransmission
if sys.getsizeof(prefixTransmission) >= 32:
transmissionMetaData = prefixTransmission[0:11]
if sys.getsizeof(prefixTransmission) > 32:
data = prefixTransmission[11:]
break
transmissionMetaData = decode_meta_data(transmission)
transmissionLength = transmissionMetaData[0]
blockX = transmissionMetaData[1]
blockY = transmissionMetaData[2]
while 1:
thisData = clientsocket.recv(4096)
data += thisData
if len(data) >= transmissionLength or not(thisData):
break
所以我目前的问题是第二条元数据根本没有通过套接字。如果我只发送 11 个字符的元数据,那么程序会挂起,传输为空。如果我让客户端发送 11 个字符的元数据,然后是图像数据本身,则服务器崩溃,因为它无法解码前 11 个字节。
UnicodeDecodeError: 'utf8' cannot decode byte 0xff in position 2: invalid start byte
我想也许我不正确地提取了 11 个字符?