TCP通訊之經典問題解決

疯狂Python發表於2024-08-21

先看下面的程式碼,研究下執行後會出現什麼?

服務端:
from socket import *
ip_port=('127.0.0.1',8003)
buffer_size=1024

sock_server=socket(AF_INET,SOCK_STREAM)
sock_server.bind(ip_port)
sock_server.listen(5)

while True:
    print('服務端建立連線...')
    conn,addr=sock_server.accept()
    while True:
            data=conn.recv(1024)
            print('服務端輸出結果:',data)
            conn.send(data.upper())
conn.close()
sock_server.close()


客戶端:
from socket import *
ip_port=('127.0.0.1',8002)
buffer_size=1024

sock_client=socket(AF_INET,SOCK_STREAM)
sock_client.connect(ip_port)

while True:
    cmd=input('輸入命令:')
    if not cmd:continue
    if cmd == 'quit':break
    sock_client.send(cmd.encode('utf-8'))
    data=sock_client.recv(1024).decode('utf-8')
    print(data)

輸出報錯結果解析:
1> 客戶端輸入quit,服務端報錯如下:

服務端此時會迴圈報這個錯,客戶端不用改,服務端改寫方法:

from socket import *
ip_port=('127.0.0.1',8003)
buffer_size=1024

sock_server=socket(AF_INET,SOCK_STREAM)
sock_server.bind(ip_port)
sock_server.listen(5)

while True:
    print('服務端建立連線...')
    conn,addr=sock_server.accept()
    while True:
            data=conn.recv(1024)
            if not data: break
            print('服務端輸出結果:',data)
            conn.send(data.upper())
conn.close()
sock_server.close()

2> 上面客戶端輸入quit正常退出後服務端報錯的問題解決了,但是還有種情況,比如客戶端突然意外中斷了而不是正常退出,服務端報錯如下:

服務端程式碼改寫如下:
from socket import *
ip_port=('127.0.0.1',8003)
buffer_size=1024

sock_server=socket(AF_INET,SOCK_STREAM)
sock_server.bind(ip_port)
sock_server.listen(5)

while True:
    print('服務端建立連線...')
    conn,addr=sock_server.accept()
    while True:
        try:
            data=conn.recv(1024)
            if not data: break
            print('服務端輸出結果:',data)
            conn.send(data.upper())
        except Exception as e:
            break
conn.close()
sock_server.close()

至此為止,問題解決了。

相關文章