2016-05-22 29 views
0

ソケットを使用して画像を受信するのに苦労します。私は、ソケットがヘッダーと実際のイメージの両方を送信し、2つの異なるデコードが必要であるという事実に関連していると思います。Python 3ソケットを使用して画像を受信する

これはコードである:

import socket 

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'.encode('utf-8')) 
count = 0 
fhand = open("stuff.jpg", "wb") 
while True: 
    data = mysock.recv(512) 
    if len(data) < 1: 
     break 
    fhand.write(data) 
mysock.close() 
fhand.close() 
+0

**ソケットを使用していますか? –

+0

はい。私はurllib.request方法を知っています: 'from urllib.request import urlopen img = urlopen( 'http://www.py4inf.com/cover.jpg').read() fhand = open( 'cover.jpg' 、 'wb') fhand.write(img) fhand.close() ' –

答えて

1

はい、ヘッダがあります。その終わりは最初の\ r \ n \ r \ nシーケンスの後です。そのシーケンスを見たら、残りをファイルに送ります。ここに粗修正があります:

import socket 

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as mysock: 
    mysock.connect(('www.py4inf.com', 80)) 
    mysock.send(b'GET http://www.py4inf.com/cover.jpg HTTP/1.0\n\n') 
    header = b'' 
    while True: 
     data = mysock.recv(512) 
     if not data: 
      raise RuntimeError('no header?') 
     header += data 
     # end-of-header in buffer yet? 
     eoh = header.find(b'\r\n\r\n') 
     if eoh != -1: 
      break 
    # split the header off and keep data read after it. 
    header,data = header[:eoh+4],header[eoh+4:] 
    print(header.decode()) 
    with open("stuff.jpg", "wb") as fhand: 
     fhand.write(data) 
     while True: 
      data = mysock.recv(512) 
      if not data: 
       break 
      fhand.write(data) 

ここにヘッダーがあります。コンテンツの長さはヘッダーにあることに注意してください。キープアライブでHTTPリクエストを送信する場合は、ヘッダーの後にそのバイト数を正確に読み取る必要があります。 Connection: closeが指定されているので、それ以上のデータが受信されなくなるまで読んでください。

HTTP/1.1 200 OK 
Date: Sun, 22 May 2016 23:22:20 GMT 
Server: Apache 
Last-Modified: Fri, 04 Dec 2015 19:05:04 GMT 
ETag: "b294001f-111a9-526172f5b7cc9" 
Accept-Ranges: bytes 
Content-Length: 70057 
Connection: close 
Content-Type: image/jpeg 
関連する問題