簡體   English   中英

通過TCP套接字發送消息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM