有一台服务器从CCTV发送图像。数据如下所示:
--BoundaryString
Content-type: image/jpeg
Content-Length: 15839
... first image in binary...
--BoundaryString
Content-type: image/jpeg
Content-Length: 15895
... second image in binary...
等等(它无限期地继续)。我正在尝试使用pyCurl来获取一个这样的图像:
curl = pycurl.Curl()
curl.setopt(curl.URL, 'http://localhost:8080')
with open('image.jpg', 'w') as fd:
curl.setopt(curl.WRITEFUNCTION, fd.write)
curl.perform()
但它不会在一个图像后停止并继续从服务器读取。有没有办法告诉curl在一部分之后停止?
或者,我可以使用套接字并实现一个简单的GET /我自己。这不是问题。但是我想知道在这种情况下是否可以使用pyCurl,我也想知道这是什么,因为它看起来不像是一个合适的多部分消息给我。 / p>
服务器被称为"运动" (Linux的视频运动检测守护进程)。
谢谢。
答案 0 :(得分:0)
这是一些适合我的代码。 (python 2)
这将获取服务器发送的所有图像。如果您在保存图像后只需要一个sys.exit(0)
。
from functools import partial
import socket
def readline(s):
fx = partial(s.recv, 1)
ret = [x for x in iter(fx, '\n')]
return ''.join(ret)
def main():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 8080))
while True:
line = readline(s)
if line.rstrip('\r') == '--BoundaryString':
content_type = readline(s)
length = int(readline(s).rstrip('\r').split()[-1])
_ = readline(s) # we skip an empty line
image = ''
while length:
data = s.recv(length) # here is receiving only 1375 bytes even if you tell it more
length -= len(data) # so we decrement and retry
image += data
# print repr(image[:20]) # was for debug
# TODO --> open a file and save the image
if __name__ == "__main__":
main()