scoketモジュール
最も単純なバージョン、原則:
サーバー設定:
クライアント設定:
注意:
127.0.0.1ネイティブにも復帰アドレス(自分自身だけが自分自身を識別し、他の人がアクセスすることはできません!)
送信とrecvの同時受信または送信の場合に対応するには、両側に表示することはできません!
recvデータを考慮する必要がないメモリに送られた人へと、メモリから受け取りました。
粘着性の問題を解決するためのパッケージ:
クライアント
1.辞書ヘッダ受け入れる
2.の長さを取得するためにデータ・ディクショナリを解析
辞書受け入れる3を
4に辞書から取得した実データの長さが
実際のデータを受信5.
構造体モジュール:
固定長の送信データ。
RES = struct.pack( 'I'、LEN(値))
stuct.unpack( 'i' は、RES)[0]
1つの クライアントの設定: 2 インポートソケット 3。 インポート構造体 4。 インポートJSON 5。クライアント= socket.socket() 6。 client.connect((' 127.0.0.1 '、8080 )) 7。 ながらTRUE: 8 MSG = INPUT(' コマンドを入力:').encode(' UTF-8 ' ) 9。 client.send(MSG) 10 IF lenを(MSG)== 0:続ける 。11 。ヘッダーclient.recv =(4 ) 12であります dict_size = struct.unpack(' I ' 、ヘッダ)[0] 13 のdict = client.recv(dict_size) 14 dict_json = json.loads(dict.decode(' UTF-8 ' )) 15 プリント(dict_json) 16 recv_size = 0 17 real_dataの=のB '' 18 ながら recv_size <dict_json.get(' FILE_SIZE ' ): 19件の データ= client.recv(1024 ) 20 + = real_data データ 21 recv_size + = LEN(データ) 22 プリント(real_data.decode(' GBK ' )) 23 服务端设置: 24 インポートソケット 25 インポートサブプロセス 26 インポートJSON 27 インポート構造体 28サーバ= socket.socket() 29 server.bind((' 127.0.0.1 '、8080 )) 30 server.listen(5 ) 31 32 ながらTRUE: 33 CONN、ADDR = )(server.accept 34 ながらTRUE: 35 トライ: 36 CMD = conn.recv(1024 ) 37 なら LEN(CMD)== 0:破る 38 CMD = cmd.decode(' UTF-8 ' ) 39 OBJ = subprocess.Popen( 40の CMD、シェル= Trueを、STDOUT = subprocess.PIPE、標準エラー= subprocess.PIPE) 41の RES = obj.stdout.read()+ obj.stderr.read() 42 D = { ' 名前':' YYJ '、' FILE_SIZE ' :LEN(RES)} 43 json_d = json.dumps(D) 44 、ヘッダ= struct.pack(' iが' 、LEN(json_d)) 45 conn.send(ヘッダ) 46 conn.send(json_d.encode(' UTF-8 ' )) 47 CONN。 (RES)を送る 48を 除き、eとConnectionResetError: 49 印刷(e)は 50 休憩 51 はconn.close()
ループ設計を循環させるコミュニケーションとの接続:
1つの #1 サーバ: 2 インポートソケット 。3 。4 " "" 。5 サーバー 6 固定IPアドレスとポート 。7 、24時間サービス 。8 " "" 。9サーバーsocket.socket =() #は、オブジェクト生成 10(server.bindを(' 127.0.0.1 '、8080)) #バインディングIPとポート 11。 server.listen(5)。 #のセミジョインタンク 12が 13である しばらく真: 14 CONN、ADDR = server.accept() #1 CONNと類似しているように、誰かのために待機双方向チャネル 15 印刷(ADDR) #クライアントの(「127.0.0.1」、51 323)アドレス 16 しばらくトゥルー: 17 試し: 18 データ= conn.recv(1024 ) 19 印刷(データ) #のB「」Mac、Linuxのクライアントサーバーが異常終了していない後のためにのみ受信さB 'を与えられている' 20は IF lenの(データ)== 0:BREAK 21は conn.send(data.upper()) 22である 以外はE AS ConnectionResetError: 23である プリント(E) 24 BREAK 25 はconn.close() 26 27 クライアント: 28 インポートソケット 29 30 31クライアント= socket.socket() 32 client.connect((' 127.0.0.1 '、8080 )) 33 34 ながらTRUE: 35 =入力MSG(' :>>> ' .encode()' UTF-8 ' ) 36 もし LEN(MSG)== 0:引き続き 37 client.send(MSG) 38件の データ= client.recv(1024 ) 39 プリント(データ)
ポートは、問題処理サーバの再起動でリリースされていません。