我正在撰寫一個簡單的python套接字程式,其中客戶端向服務器發送一個字串,服務器說明該字串中有多少個元音,然后將其發送回客戶端,客戶端列印輸出。現在,我不知道為什么它connection ended在發送end訊息后沒有顯示。如果我\n 從那里洗掉訊息,除了MESSAGE RECEIVED出現在Not enough vowel. 現在我可以如何顯示CONNECTION ENDED將所有訊息保存在單獨的行中。
server.py
import socket
FORMAT = 'utf-8'
PORT = 5050
HOST = socket.gethostbyname(socket.gethostname())
ADDR = (HOST,PORT)
DISCONNECTED_MESSAGE = 'End'
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(ADDR)
server.listen()
print("[LISTENING] server is listenning")
while True:
conn,addr = server.accept()
connected = True
while connected:
msg = conn.recv(2048).decode(FORMAT)
if msg == DISCONNECTED_MESSAGE:
connected = False
conn.send("CONNECTION ENDED".encode(FORMAT))
else:
vowel_count = 0
for chr in msg:
if chr in "aeiouAEIOU":
vowel_count = 1
if vowel_count == 0:
conn.send("Not enough vowels".encode(FORMAT))
elif vowel_count <= 2:
conn.send("Enough Vowel I guess\n".encode(FORMAT))
else:
conn.send("Too many vowels\n".encode(FORMAT))
conn.send("MESSAGE RECEIVED\n".encode(FORMAT))
conn.close()
client.py
import socket
PORT = 5050
HOST = socket.gethostbyname(socket.gethostname())
ADDR = (HOST,PORT)
FORMAT = 'utf-8'
DISCONNECTED_MESSAGE = 'End'
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(ADDR)
def send(msg):
message = msg.encode(FORMAT)
client.send(message)
print(client.recv(2048).decode(FORMAT))
send("Nymphs cry gypsy rhythms Why Mythy nymphs cry ?Why nymphs flyby ?")
send("Nymphs cry gypsy rhythms hello Why Mythy nymphs cry ?Why nymphs flyby ?")
send("Nymphs cry gypsy rhythms Why Mythy nymphs cry ?Why nymphs flyby ? hello hello everybody good evening")
send(DISCONNECTED_MESSAGE)
uj5u.com熱心網友回復:
這里的問題是 TCP 是流協議,而不是資料包協議。讀者不會在您撰寫的相同塊中獲得內容。在您的特定情況下,您的服務器為每個輸入發送兩個回應(元音數和“收到的訊息”)。有時,這兩條訊息被打包在一起并由客戶端在一次讀取中接收,但有時,您只讀取元音評估本身。然后您的客戶端send函式回傳,并發送下一條訊息。然后它會讀取“MESSAGE RECEIVED”,即使服務器已經排了兩行。到結束時,即使“連接結束”仍在排隊,它也會退出。
真正的解決方案是讓您的服務器在完成時發送一些“傳輸結束”信號,例如一些未使用的控制字符。然后,您的客戶端應該繼續讀取,直到它得到一個以您的“傳輸結束”信號結尾的字串。
短期修復只是讓您的服務器將它想要發送的所有字串連接到一個conn.send呼叫中。從技術上講,TCP 被允許將其分成更小的塊進行傳輸,因此它仍然可能失敗,但實際上這不會發生。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/447835.html
上一篇:位元組序和網路服務器
