【问题标题】:Why is the UDP client not able to receive the message?为什么 UDP 客户端无法接收到消息?
【发布时间】:2019-04-01 00:34:22
【问题描述】:

这里只是初学者。客户端使用sendto() 向服务器发送消息,服务器可以使用recvfrom() 接收该消息。当服务器随后尝试向客户端发送消息时,就会出现问题。客户端代码卡在indata, add = sock.recvfrom(1024)。为什么会发生这种情况?

服务器代码:

import socket
port = 8000
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
address = ('127.0.0.1',port)
try:
    s.bind(address)
except socket.error as e:
    print(e)
while True:
    data, add = s.recvfrom(1024)
    break
print(data.decode(), add)


fin = open("send.txt")
senddata = fin.read()
print(senddata)
try:
    s.sendto(senddata.encode(),address)
except socket.error as e:
    print(e)
s.close()

客户代码:

import socket

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

port = 8000
msg = 'hello server'

sock.sendto(msg.encode(),('127.0.0.1',port))

while True:
    indata, add = sock.recvfrom(1024)
    break
f = open("received.txt", 'w')
f.write(indata.decode())
sock.close()

如果客户端和服务器都在同一台机器上运行,是否应该使用多个端口?

【问题讨论】:

    标签: python-3.x sockets udp


    【解决方案1】:

    服务器在您的代码中绑定到端口 8000。客户端获取任意端口号(未使用绑定)。当服务器发送到 8000 端口时,它正在发送给自己。

    您需要两个端口,服务器需要知道客户端正在使用什么。服务器中的 recvfrom 调用应该能够告诉您远程端口号(但我不熟悉 Python 套接字 API,因此无法告诉您如何操作)。

    【讨论】:

      【解决方案2】:

      你的问题在这里:

      s.sendto(senddata.encode(),address)
      

      ... address 在这种情况下是服务器的地址,因此服务器将数据包发送回自己,而不是客户端。当我将以上内容更改为:

      s.sendto(senddata.encode(),add)
      

      ...程序按预期运行。 (对于更具描述性的变量名称,例如clientAddressserverAddress,可能需要进行论证,以避免这种混淆)

      如果客户端和服务器都在使用,是否应该使用多个端口? 在同一台机器上运行?

      是的,事实上您的代码正在使用多个端口。特别是,您的服务器将其套接字绑定到端口 8000,并且您的客户端(隐式)将其套接字绑定到其他一些端口号(因为您从未在客户端套接字上显式调用 bind(),这对于这个用例来说很好) .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-18
        • 2020-01-10
        • 1970-01-01
        • 1970-01-01
        • 2010-09-23
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        相关资源
        最近更新 更多