Python UDP套接字文件传输

时间:2014-11-24 02:40:02

标签: python sockets

如何从服务器获得响应?

客户方:

#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并不是一个很好的方式,我很确定,但这是项目的具体内容)

3 个答案:

答案 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的帮助,但我必须把它交给这个小家伙,因为这是我最终走的路。