ソケット大容量ファイルの転送(スティックパッケージを解決するために)

溶液スティックパッケージ
モジュール構造体
      struct.pack(タイプ、numは)
          タイプ:タイプはNUM 
          NUM:ある数
          R&LT = 4バイトのバイトにパックされたデジタルにstruct.pack 
      struct.unpack(タイプ、R&LT)
          機能:開梱、rは元の数値に解離し、結果はタプルで、添字ビット位置における元の数値は0タプル
#1 溶液スティックパッケージ:原理は、サーバがコンテンツ辞書をrecvをする辞書長さに応じて、辞書の長さを受信することですそれがくっつくによって引き起こされたファイルのコンテンツ辞書とファイルのコンテンツの内容のために最後に残ったスペースを受け取った後にrecvが発生することはありません
          
#の実装ファイルのアップロード機能   
#のクライアント層の
インポートソケット
 インポートJSON
 インポート構造体
 のインポートOS 

SK = ソケット.socket()
sk.connect((" 10.70.2.143 "、8080))
オプション = { " 1 "" アップロード"" 2 "" ダウンロード" }
 ための指標値option.items():
     プリント(インデックス値)
NUM =入力(" 请输入您的选择" もし NUM == " 1 " 
    DIC = { " OPT ":option.get(NUM)、" ファイル名":なし、" ファイルサイズ":無し}
    FILE_PATH =入力( " アップロードされたファイルへの絶対パスを入力してください" 
    ファイル名 = os.path.basename(FILE_PATH)
    ファイルサイズ = os.path.getsize(FILE_PATH)
    DIC [ " ファイル名" ] = ファイル名
    DIC [ " ファイルサイズ" ] = ファイルサイズ
     文字列の辞書それ 
    str_dic = json.dumps(DIC)
    は、スティック包装解決するために、辞書の長さを取得します 
    len_dic = LEN(str_dic)
    サーバが原則を受信した後、辞書の長さに応じて、辞書の長さ:ソリューションスティックパッケージ辞書へのrecvコンテンツ、それがくっつくによって引き起こされたファイルのコンテンツ辞書とファイルのコンテンツの内容について最後に残ったスペース受けた後のrecvが発生することはありません
    #をデータ・ディクショナリ4バイト長を表す
    #をサーバは、第一の受信RECVを受信した場合(4)長さバイトが得られた辞書の長さであろう 
    b_len_dic struct.pack =(Iが、len_dic)   #1 I辞書の元の長さのデータ型であり、2番目のパラメータは必須変換であります辞書自体の長
    バイト長と辞書や辞書コンテンツスプライシング伝送のタイプ 
    (b_len_dic +のstr_dic.encode(sk.send UTF-8 ))  この時点では、辞書の内容は、型スプライシングがバイト行うことができるバイト

    ファイルをアップロード 
    オープン(FILE_PATH、と" RB " F AS):
        ファイルサイズによると、アップロード
        中のファイルサイズを:
            コンテンツ = f.read(1024 
            sk.send(コンテンツ)
            ファイルサイズ - = LEN(コンテンツ)
パス
sk.close() 






サーバー層
のインポートソケット
 インポートJSON
 のインポート構造体


SK = socket.socket()
sk.bind((" 10.70.2.143 "、8080 ))
sk.listen()
コネチカット、ADDR = sk.accept ()
は、最初の長さは4バイトの長さにわたってクライアント辞書パスから受信 
b_len_dic conn.recv =(4 辞書のバイト長の長辞書は整数長アンパックある 
(len_dic = struct.unpackを私は [0])、b_len_dic 辞書は要素のタプルの長さにわたって渡されるため0添字辞書の長さに応じて辞書の内容を受信するファイル転送は発生しません次回スティックパック現象 
str_dic = conn.recv(len_dic).decode(UTF-8 辞書に抗シーケンスの辞書文字列 
DIC =のjson.loads(str_dic)
 IF DIC [ オプトイン ] == アップロード同じファイル名を防ぐために、ファイル名の文字列スプライシング区別 
    ファイル名= 1  + DIC [ ファイル名]
     #のファイルが上を通過、クライアントから受信した 
    (オープンでファイル名、AB&F AS):
        受信したデータのファイルサイズ
        ながら、 DIC [ "ファイルサイズ"]:
            コンテンツ = conn.recv(1024 
            f.write(コンテンツ)
            #の辞書ファイルのサイズを引い受け入れファイルサイズ 
            DIC [ " ファイルサイズ" ] - = LEN(コンテンツ)
 のelif DIC [ " 選ぶ" ] == " ダウンロード" パス
はconn.close()
sk.close()

 

おすすめ

転載: www.cnblogs.com/god-for-speed/p/11719047.html