この問題を解決するために、粘着性scoketモジュールパッケージ、通信接続および循環ループ

scoketモジュール

最も単純なバージョン、原則:

サーバー設定:

クライアント設定:

注意:

127.0.0.1ネイティブにも復帰アドレス(自分自身だけが自分自身を識別し、他の人がアクセスすることはできません!)

送信とrecvの同時受信または送信の場合に対応するには、両側に表示することはできません!

recvデータを考慮する必要がないメモリに送られた人へと、メモリから受け取りました。

粘着性の問題を解決するためのパッケージ:

サーバー

1.まず、クライアントに送信する辞書を作ります

2.辞書の見出しを作ります

3.辞書ヘッダを送信します

4.辞書を送ります

再発実際のデータ

クライアント

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      プリント(データ)
コードの表示

ポートは、問題処理サーバの再起動でリリースされていません。

ソケット輸入SOL_SOCKET、SO_REUSEADDRから

sk.setsockopt(SOL_SOCKET、SO_REUSEADDR、1)#はそれでは、バインド前に追加しました

 

おすすめ

転載: www.cnblogs.com/yangjiaoshou/p/11317774.html
おすすめ