我正在阅读一本名为" Python for Informatics"。
的免费电子书我有以下代码:
import socket
import time
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com', 80))
mysock.send('GET http://www.py4inf.com/cover.jpg HTTP/1.0\n\n')
count = 0
picture = ""
while True:
data = mysock.recv(5120)
if (len(data) < 1):
break
# time.sleep(0.25)
count = count + len(data)
print len(data), count
picture = picture + data
mysock.close()
# Look for the end of the header (2 CRLF)
pos = picture.find("\r\n\r\n")
print 'Header length',pos
print picture[:pos]
# Skip past the header and save the picture data
picture = picture[pos+4:]
fhand = open("stuff.jpg","w")
fhand.write(picture)
fhand.close()
我对http不了解,并且很难理解上面的代码!
我想我确实理解了mysock.connect()和mysock.send()的作用但是我需要解释第1行: 1) mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
。它做了什么?
现在,关于这一行: 2) data = mysock.recv(5120)
。它创建了一个名为data的var,其中while循环运行时节省了5120个字节。但是这些数据是什么类型的数据以及我运行时会发生什么:picture = picture + data
?它的图片=&#34;&#34; +数据,
???
最后: 3)
pos = picture.find("\r\n\r\n")
print 'Header length',pos
print picture[:pos]
pos = picture.find("/r/n/r/n")
,这会在图片变量中搜索以查找2个新行&#34; / n / n&#34;因为我们使用了行mysock.send('GET http://www.py4inf.com/cover.jpg HTTP/1.0\n\n')
??
有没有办法立即将jpeg文件保存在我们的硬盘驱动器上而不检索http标头并从jpeg文件中分离标题?
对不起我的英语...随意问一些你可能不理解的事情! 感谢
答案 0 :(得分:1)
您的第一个问题已在SO上多次询问和回答。简短的回答是,“这只是一个技术性问题;你真的不需要知道。”
你是对的。
标题以两个CRLF结尾。如果您保存文件而不丢弃标题,它将不是JPEG格式,您将无法使用它。标题是允许文件通过互联网传输的。您必须丢弃它并仅保存有效负载。
答案 1 :(得分:1)
行mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
调用socket
库中的socket
类来创建新的网络端点。 socket.AF_INET
告诉调用创建基于IP的套接字,socket.SOCK_STREAM
请求一个面向流的(TCP)套接字,它会自动发送任何必要的确认和重试。
语句data = mysock.recv(5120)
读取的块,最多 5120个字节。当没有更多数据时,recv()
调用返回空字符串。测试似乎相当不正常,使用if len(data) == 0
甚至if not len(data)
会更好,但这是风格而非实质的细节。因此,语句picture = picture + data
一次累积响应数据5120个字节(虽然命名很差,因为累积的数据实际上包括HTTP头和图片数据)。
语句pos = picture.find("\r\n\r\n")
在返回的字符串中寻找HTTP标头的末尾。由于它找到字符串的开头而不是结尾,因此必须将4添加到偏移量以给出图片数据的起始位置。
给出的示例是尝试演示对HTTP数据的低级访问,显然,没有为您提供有关正在发生的事情的充分背景知识。访问数据的更常规方法是使用更高级别的库,例如urllib
。这里有一些代码可以更简单地检索图像:
>>> import urllib
>>> response = urllib.urlopen("http://www.py4inf.com/cover.jpg")
>>> content = response.read()
>>> outf = open("cover.jpg", 'wb')
>>> outf.write(content)
>>> outf.close()
我可以毫无问题地打开生成的JPEG文件。