私たちが行うことができますが前の位置には、コードを書くために、多くの潜在的なバグがあります
- 問題を解決します
- ポートリユース:時々ポートOSの回復には時間がかかるため、サーバーのポートがまだ占有されてオフになって、この時間は、2つのソリューションがあります。
- リユースポートを達成するために.setsockopt方法
- LinuxのOSの場合:Linuxは、システムの設定を変更します
クライアントが空の文字列を送信すると、サーバーは、物事を受けることができないので、それがクライアントに応答しませんので、それは、クライアント上のrecvステップで立ち往生されます
原則:アプリケーションがOSを介してデータを送受信しなければならない、それは基本的に送信し、RECVデータを、そのOSのメモリデータとの対話です。OS通信情報は、プロトコルに従って処理されます。クライアントは、追加のヘッダーを介して、データ、空のデータを送信すると、サーバーに行われるが、サーバーへのOSが、同等の何がものを受信しなかった場合に、サーバーアプリケーションがメモリからデータを取得するので、私はしないでくださいこれは、クライアントにデータを送信します。
- クライアントからの空のデータを回避する必要性
- クライアント(すなわち、双方向接続CONNソケット物体側がオフにされる)強制終了、
- Linuxの場合:無制限のサーバが楽しまれます(ヌル・バイトは無限ループに受信されています)
- Windowsが文句を言うでしょう:ConnectionResetErrorを
- ポートリユース:時々ポートOSの回復には時間がかかるため、サーバーのポートがまだ占有されてオフになって、この時間は、2つのソリューションがあります。
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()