如何从服务器获得响应?
客户方:
#CLIENT
import socket
import time
host = "localhost"
port = 5454
data_c = input()
c = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
c.sendto(bytes(data_c, 'utf-8'),(host,port))
print( data_c )
print( c.recv(1024).decode('utf-8'))
服务器端:
#SERVER
import socket
import time
host = "localhost"
port = 5454
data_s = "ACKNOWLEDGMENT"
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, port))
print(s.recv(1024).decode('utf-8'))
我可以从服务器发送客户端将收到的消息,但似乎无法进行通信(如ACK)以使其返回服务器。
(是的,UDP并不是一个很好的方式,我很确定,但这是项目的具体内容)
答案 0 :(得分:0)
问题1:发送ACK,你可以复制你反向的内容。
答案 1 :(得分:0)
由于UDP是无连接的,因此您事先不知道收到数据包来自的数据包,因此您必须使用recvfrom
来获取数据包和数据包来自的对等体(地址/端口)。然后你必须使用该地址发回数据。
您现在在客户端中所做的事情(但实际上是服务器的内容)是将上的相同数据一遍又一遍地发送给自身。相反,在循环中,您应该使用先前提到的recvfrom
接收数据包,然后将回复发送给您收到数据包的对等方。
类似于以下伪代码
while True:
peer = recvfrom(...)
sendto(..., peer)
答案 2 :(得分:0)
经过多次尝试从我的服务器获得简单的确认回复后,这样做了。 除了字面上完全在每一轮开始之外,time.sleep(.1)函数是唯一缺失的键。它允许服务器和客户端都有时间关闭当前套接字连接,这样就不会出现尝试将多个主体绑定到单个位置的错误。
OSError: [WinError 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted
工作结果:
#SERVER
import socket
import time
host = "localhost"
port = 5454
data_s = "ACKNOWLEDGMENT"
while 1:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, port))
received = print("Client: " + s.recv(1024).decode('utf-8')) #waiting to receive
s.close
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
time.sleep(.1)
s.sendto(bytes(data_s, 'utf-8'),(host,port)) #sending acknowledgment
print("Server: " + data_s)
s.close # close out so that nothing sketchy happens
time.sleep(.1) # the delay keeps the binding from happening to quickly
服务器命令窗口:
>>>
Client: hello
Server: ACKNOWLEDGMENT
客户端:
#CLIENT
import socket
import time
host = "localhost"
port = 5454
c = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while 1:
data_c = input("Client: ")
c = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
c.sendto(bytes(data_c, 'utf-8'),(host,port)) #send message
c.close
# time.sleep()
c = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
c.bind((host, port))
print("Server: " + c.recv(1024).decode('utf-8')) # waiting for acknowledgment
c.close
c = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
time.sleep(.1)
客户端命令窗口:
>>>
Client: hello
Client: hello
Server: ACKNOWLEDGMENT
我最终删除了顶部的冗余输入("客户端:")。 特别感谢@JoachimPileborg的帮助,但我必须把它交给这个小家伙,因为这是我最终走的路。