ソケットネットワークプログラミング(5)の第VIII章:クライアントとサーバのコードのバグ修正(コード補完)

私たちが行うことができますが前の位置には、コードを書くために、多くの潜在的なバグがあります

  • 問題を解決します
    • ポートリユース:時々ポートOSの回復には時間がかかるため、サーバーのポートがまだ占有されてオフになって、この時間は、2つのソリューションがあります。
      • リユースポートを達成するために.setsockopt方法
      • LinuxのOSの場合:Linuxは、システムの設定を変更します
    • クライアントが空の文字列を送信すると、サーバーは、物事を受けることができないので、それがクライアントに応答しませんので、それは、クライアント上のrecvステップで立ち往生されます

      原則:アプリケーションがOSを介してデータを送受信しなければならない、それは基本的に送信し、RECVデータを、そのOSのメモリデータとの対話です。OS通信情報は、プロトコルに従って処理されます。クライアントは、追加のヘッダーを介して、データ、空のデータを送信すると、サーバーに行われるが、サーバーへのOSが、同等の何がものを受信しなかった場合に、サーバーアプリケーションがメモリからデータを取得するので、私はしないでくださいこれは、クライアントにデータを送信します。

      • クライアントからの空のデータを回避する必要性
    • クライアント(すなわち、双方向接続CONNソケット物体側がオフにされる)強制終了、
      • Linuxの場合:無制限のサーバが楽しまれます(ヌル・バイトは無限ループに受信されています)
      • Windowsが文句を言うでしょう:ConnectionResetErrorを

server.py

import socket

phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 端口重用
phone.bind(('127.0.0.1',8080))  
phone.listen(5)  

print('starting...')  
conn, client_addr = phone.accept()  

#5 收,发消息(传数据)
while True:
    try:  # windows的情况会报错,所以我们需要异常处理
        data = conn.recv(1024)
        if not data : break  # 避免服务端的死循环:Linux的情况下
        print('客户端的数据',data)
        conn.send(data.upper())
    except ConnectionResetError:
        break
    
conn.close() 
phone.close()  

client.py

import socket

phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  

phone.connect(('127.0.0.1',8080))

#3 发,收消息
while True:
    msg = input('>>> : ').strip()
    if not msg : continue  # 避免客户端发空数据(这个写法留意一下)
    phone.send(msg.encode('utf-8'))
    data = phone.recv(1024)
    print(data)

phone.close()

おすすめ

転載: www.cnblogs.com/py-xiaoqiang/p/11298981.html