这里只是个初学者。客户端使用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()
如果客户端和服务器都在同一台计算机上运行,是否应该使用多个端口?
答案 0 :(得分:0)
您的问题在这里:
s.sendto(senddata.encode(),address)
... address
在这种情况下是服务器的地址,因此服务器会将数据包发回自身,而不是发回客户端。当我将以上内容更改为:
s.sendto(senddata.encode(),add)
...该程序按预期工作。 (为了避免这种混淆,可能需要为更具描述性的变量名(例如clientAddress
和serverAddress
进行争论)
如果同时使用客户端和服务器,则应使用多个端口 在同一台机器上运行?
是的,实际上您的代码正在使用多个端口。特别是,您的服务器将其套接字绑定到端口8000,而您的客户端(隐式)将其套接字绑定到其他端口号(因为您从未在客户端套接字上显式调用bind()
,这对于此用途来说是很好的-情况)。
答案 1 :(得分:0)
服务器在您的代码中绑定到端口8000。客户端获得任意端口号(不使用绑定)。服务器发送到端口8000时,它正在发送给自己。
您需要两个端口,服务器需要知道客户端在使用什么。服务器中的recvfrom调用应该能够告诉您远程端口号(但是我不熟悉Python套接字API,因此无法告诉您如何操作)。