最初のプログラムを与えます:
輸入ランダム 輸入ソケット 輸入構造体 のインポートスレッド 輸入ピクルス 輸入JSON から構造体のインポート * からの時間インポート睡眠 クラスSENDMSG: デフ __init__ (自己): self.sendType = B 「\ X01 」#準備 self.cliType = B 「\ X01 」 自己.lonDir = B ' E ' self.latDir = B "N ' self.cliNum = 1 self.lonDeg = 100 self.lonMin = 100 self.lonSec = 100 self.latDeg = 100 self.latMin = 100 self.latSec = 100 self.year = 2019 self.month = 9 self.day = 6 self.hour = 12 self.minute = 10 self.second = 10 self.ipFirst = 192 self.ipSecond = 168 self.ipThird = 6 self.ipFourth= 108 self.typeStr = ' cccciiiiiiiiiiiiiiiii ' DEF __str__ (自己): 戻りself.cliNumの クラスRecMsg(): DEF __init__ (自己): self.id = B ' \ X02 ' self.ipFirst = 192 self.ipSecond = 168 セルフ.ipThird = 6 self.ipFourth = 108 self.port = -1 self.errorType = B ' \ X01 ' self.bandWidth = -1 self.typeStr = ' = ciiiiici ' クラス CommunateThread(threading.Thread): #继承父类threading.Thread デフ __init__ (自己、ID、パケット損失、ソケット、localIP、localPortでは、remoteIP、次に、remoteport、ファイル): threading.Thread。__init__ (自己) self.id = ID self.packetLoss = パケット損失 self.socket = ソケット self.localIP = localIP self.localPort = localPortでは self.remoteIP = remoteIP self.remotePort =次に、remoteport self.file = ファイル DEF(セルフ)を実行します: #スレッド内で実行されるコードを書くためには、作成後に直接run関数機能を実行して実行されます 接続= Falseの 中に真: IF ません接続します self.sendConnect() データ、ADDR self.socket.recvfrom =(1024 ) プリント(" 受信送信されたメッセージ{} {} " .format(ADDR、データ)) recMes = RecMsg() recData = struct.unpack(recMes.typeStr、データ) を印刷(recData) もし recData [0] == B ' \ X01 ' または(recData [0] == B ' \ X03 ' と recData [6] == B ' \ X01 ' ): self.sendFile(recData) DEF readFileの(自己) : (self.file、オープンと" RB " Fとして): データ = f.read(1024 ) しながらデータ: 収率データ データ = f.read(1024 ) DEF SENDFILE(自己、recData): IP = "{} {} {} {}。。。」 .format(recData [1]、recData [2]、recData [3]、recData [4 ]) ポート = recData [5 ] 試みる: S = socket.socket(ソケット.AF_INET、socket.SOCK_DGRAM) I = 1 のためのデータでself.readFile(): P = random.randint(1100 ) もし P < self.packetLoss: 続ける s.sendto(データ(IPアドレス、ポート)) スリープ( 0.005 ) 、I + = 1 場合は私%1000 : 印刷(I、" :{}、1K:{}に送る" .format(IP、ポート)) プリント(" 发送完成、总计发送{} K " .format(I)) を除いとして例外E: プリント(e)の デフsendConnect(自己): 接続 = SENDMSG() connect.cliNum = self.id データ = パック(connect.typeStr、 connect.sendType、 connect.cliType、 connect.lonDir、 connect.latDir、 connect.cliNum、 connect.lonDeg、 connect.lonMin、 connect.lonSec、 connect.latDeg、 connect.latMin、 connect.latSec、 connect.year、 connect.month、 connect.day、 connect.hour、 接続します。分、 connect.second、 connect.ipFirst、 connect.ipSecond、 connect.ipThird、 connect.ipFourth) #データ=パック( 'ccccb'、connect.sendType、connect.cliType、connect.lonDir、connect.lonDir、connect.year) 印刷(データ) self.socket.sendto(データ、(self.remoteIP、 self.remotePort)) プリント(" {}に送信する:{} \ T \ N {} "接続、.format(self.remoteIP、self.remotePort。__str__ ())) デフprint_time(のthreadName、遅延、カウンタ): パス
メッセージを送信するために熱心に、そのコードは少し混沌とした、ノーコメント、ヒッヒッヒはありません。
私たちは、メッセージを送信するためのPythonの使用UDPだけのバイトを送信することができます知っています。どのように、それを開梱し、C ++(C#の)ボディ構造のパッキングと?パックを使用して解凍。
例えば、私たちの構造はそのようになっています
彼らは、charとint型データです。だから我々は(それは構造があることである)バイトストリームにパックされたこの構造を置きます:
私は、直接バイト(文字/文字)* 4 + 4(INT)* 17 = 32ビットの数を送信パッキン。C ++ / C#のレセプションでは、問題ありません。
しかし、レセプションには、問題が整列することができません。だから、アンパック形式の私達の定義は、受信しました:
「=」を追加する理由については、Pythonドキュメント、詳細な説明を見つけることができます。