[英]Sending messages via TCP sockets
我正在編寫服務器從1到256 KB發送給客戶端的代碼。 客戶端收到消息,必須將其返回給服務器。 該過程必須重復1000次。 從文件中讀取消息。 服務器正在發送,客戶端正在將其拾取並發回,但是在特定時刻它停止了。 我想知道我的代碼出了什么問題。
服務器:
import socket
hostA = '127.0.0.1'
portA = 50031
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp.bind((hostA, portA))
dest = ('127.0.0.1',50008)
arquivo = 'texto.txt'
arq = open(arquivo , 'r')
arq = arq.read()
for i in range(0, 9):
dado = arq[0:(1024 * (2**i))]
for j in range(0, 1000):
for k in range(0, (len(dado) / 1024)):
x = dado[k:k+1024]
udp.sendto(x, dest)
for k in range(0, (len(dado) / 1024)):
msg, cliente = udp.recvfrom(1024)
udp.close()
客戶:
import socket
hostB = '127.0.0.1'
portB = 50008
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp.bind((hostB, portB))
orig = ('127.0.0.1',50031)
dado = ""
for i in range(0, 9):
for j in range(0, 1000):
for l in range(0, ((1024 * (2**i))/1024)):
msg, cliente = udp.recvfrom(1024)
dado += msg
for k in range(0, ((1024 * (2**i))/1024)):
x = dado[k:k+1024]
udp.sendto(x, orig)
udp.close()
您的問題詢問“ TCP套接字”,但您未使用TCP。
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp.bind((hostA, portA))
您正在使用UDP。 與TCP不同,UDP不檢測丟失的數據包或重新傳輸或重新排序數據。
您的協議對數據包丟失沒有容忍性。 如果從服務器到客戶端或從客戶端到服務器的單個數據包丟失,則雙方將永遠等待對方。
您也有其他問題。 想象一下,如果服務器以錯誤的順序接收到客戶端發送的兩個數據報。 數據將被破壞。
如果要在UDP而不是TCP上進行設計,則必須自己實現TCP所需的一切。 如果您需要丟失的數據報檢測和重新傳輸,則需要自己實現或使用TCP。 同上用於發送起搏,處理亂序接收等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.