:起こしやすい説明が参照できるパッケージ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ファイルに転送することができます。
結果は以下の通りであります: