UDP客户端为什么不能接收消息?

时间:2018-10-27 13:39:23

标签: python-3.x sockets udp

这里只是个初学者。客户端使用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()

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

2 个答案:

答案 0 :(得分:0)

您的问题在这里:

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

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

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

...该程序按预期工作。 (为了避免这种混淆,可能需要为更具描述性的变量名(例如clientAddressserverAddress进行争论)

  

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

是的,实际上您的代码正在使用多个端口。特别是,您的服务器将其套接字绑定到端口8000,而您的客户端(隐式)将其套接字绑定到其他端口号(因为您从未在客户端套接字上显式调用bind(),这对于此用途来说是很好的-情况)。

答案 1 :(得分:0)

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

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