1

マルチイメージファイルをダウンロード/アップロードするために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:]
4

1 に答える 1

1

ソケット接続には最大 OS 送受信バッファ サイズがあります。がないtime.sleepと、すべてのリクエストが即座に送信され、バッファがいっぱいになります。

于 2013-10-29T06:35:59.233 に答える