【问题标题】:Sending messages via TCP sockets通过 TCP 套接字发送消息
【发布时间】:2019-03-31 14:16:30
【问题描述】:

我正在制作一个服务器向客户端发送 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() 

【问题讨论】:

  • 您能告诉我们您在代码中遇到的具体错误或问题吗?

标签: python sockets udp


【解决方案1】:

您的问题是关于“TCP 套接字”,但您没有使用 TCP。

udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp.bind((hostA, portA))

您正在使用 UDP。与 TCP 不同,UDP 不检测丢失的数据包或重新传输或重新排序数据。

您的协议无法容忍数据包丢失。如果从服务器到客户端或从客户端到服务器的单个数据包丢失,双方将永远等待对方。

您还有其他问题。想象一下,如果客户端发送的两个数据报被服务器以错误的顺序接收。数据将被损坏。

如果你想在 UDP 而不是 TCP 之上进行设计,你必须自己实现 TCP 提供的所有你需要的东西。如果需要丢失数据报检测和重传,需要自己实现或者使用TCP。同样适用于传输调步、处理乱序接收等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多