Pythonの研究では、33ノート:スティッキー構造体を用いた伝送プロトコルモジュール中に問題のTCPパケットを解決するために

:起こしやすい説明が参照できるパッケージTCPプロトコルに関するスティッキー質問https://www.cnblogs.com/Eva-J/articles/8244551.html#_label6

 

この部分ではほとんどそれを記録、から学ぶために、上記のブログを参照してくださいです。

#構造体モジュール: - >モジュールは、番号などのタイプであることができる、バイトの固定長への変換は、
構造体インポート
RET = struct.pack#「I」代表INT(「I」が4096、)、デジタル変換を取るとしています固定長(4バイト)入力バイト
印刷(RET)

NUM = struct.unpack( 'I'、RET)#タプルを出力する
プリント(NUM [0])

デジタルパックを使用すると、固定長(4バイト)に変換することができるタイプのバイト、それはあなたがファイル転送のサイズを知る必要があり、その後unpackを解決することができ、唯一の4バイトのrecv時間を受け取ることができます。

 

転送プロセスのビデオファイルを使用して、TCPプロトコルに基づいて、次のショーが行わSTRUCT:

server.py

#实现一个大文件的上传或者下载
#配置文件IP地址端口号
インポートソケット
インポート構造体
インポートJSON 

SK = socket.socket()
sk.bind(( '127.0.0.1'、8080))
sk.listen()
バッファ= 4096 

CONN、ADDR = sk.accept()
接收
head_len = conn.recv(4)
head_len = struct.unpack( 'I'、head_len)[0] 
json_head = conn.recv(head_len).decode( 'UTF-8 ')
ヘッド= json.loads(json_head)
ファイルサイズ=頭部' [ 'ファイルサイズ] 
オープン(頭付き['ファイル名']、' Fとして)「WB:
    ながら、ファイルサイズ:
        もしファイルサイズ> =バッファー:
            コンテンツ= conn.recv(バッファ)
            f.write(コンテンツ)
            ファイルサイズ- =バッファ 
        他:
            コンテンツ= conn.recv(ファイルサイズ)
            f.write(コンテンツ)
            ブレーク

はconn.close()
sk.close()

 

client.py

#发送端
インポートソケット
インポートOSの
インポートのJSON 
インポート構造体

SK = socket.socket()
sk.connect(( '127.0.0.1'、8080))
バッファ= 4096 

#发送文件
ヘッド= { 'ファイルパス'、R '/ユーザ/ zxx /ダウンロード、
        'ファイル名':r'test.mp4' 、
        'ファイルサイズ':なし} 

FILE_PATH = os.path.join(ヘッド[ 'ファイルパス']、頭部[ 'ファイル名'])
ファイルサイズ=はos.path。 getSize(FILE_PATH)
ヘッド[ 'ファイルサイズ'] =ファイルサイズの
json_head = json.dumps(ヘッド)#字典转成了字符串
bytes_head = json_head.encode( 'UTF-8')#文字列の転送はバイト
#プリント(json_head) プリント(bytes_head) は、ヘッドの長さ算出
head_len = LEN(bytes_head)  
pack_len struct.pack =( 'I'、head_len)をプリント(head_len、pack_len)
 
sk.send(pack_len)#第1の送信ヘッド長
sk.send(bytes_head)透過型ヘッダ位バイト
F ASオープン(FILE_PATH、 'RB')を有する:
    一方のファイルサイズ:
        ファイルサイズIF> = :バッファ
            内容= f.read(バッファ)#はそれぞれの内容を読み出す
            sk.send(コンテンツ)
            - =緩衝液Aファイルサイズを
        :他の
            コンテンツ= f.read(ファイルサイズ)
            sk.send(コンテンツ)
            のBREAK 

)(sk.closeを

 

server.pyが実行されclient.pyファイルされた後、あなたはtest.mp4ファイルのダウンロードディレクトリにローカルの作業ディレクトリのpythonファイルに転送することができます。

結果は以下の通りであります:

 

 

おすすめ

転載: www.cnblogs.com/zheng1076/p/11311084.html