マルチイメージファイルをダウンロード/アップロードするためにpython SocketServerを使用しています。
サーバーコード
class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
'''
Here is other codes......
'''
#start sending files to client...
for img_name, img_size in dict_image_sizes.iteritems():
image_file = open(u"%s\\%s" % (image_folder, img_name), 'rb')
while True:
image_chunk = image_file.read(32768)
if not image_chunk:
break
self.request.sendall(image_chunk)
image_file.close()
クライアントコード:
#start recving...
for img_name, img_size in dict_image_sizes.iteritems():
each_image_file = open(u'%s\\%s\\%s' % (env.cache_path, relative_path, img_name), 'wb')
chunk_size = 4096
img_size_int = int(int(img_size)/chunk_size)
img_size_mod = int(math.fmod(int(img_size), chunk_size))
import time
image_chunk = ''
for i in range(img_size_int):
image_chunk += sock.recv(chunk_size)
#time.sleep(0.001)
image_chunk += sock.recv(img_size_mod)
each_image_file.write(image_chunk)
each_image_file.close()
問題は、マークを外すかどうかです
#time.sleep(0.001)
Client Code では問題ありません。そうしないと、多くの画像が破損する可能性があります (常にではありませんが、場合によっては)。
Corrupt JPEG data: premature end of data segment
この問題を解決する方法はありますか? 追加してみました
sock.settimeout(1)
クライアント用ですが、うまくいきません。
問題が解決しました。毎回返される正確なバイトの送信/受信を確認する必要があります。こちらを参照してください: Python のノンブロッキング ソケット?
def recvall(sock, size):
data = ''
while len(data) < size:
d = sock.recv(size - len(data))
if not d:
# Connection closed by remote host, do what best for you
return None
data += d
return data
def sendall(sock, data):
while data:
sent = sock.send(data)
data = data[sent:]