2014-11-24 118 views
0

如何从服务器获取响应?Python UDP套接字文件传输

客户端:

#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

关于SO的问题应该是具体的,每个问题只能说一个问题。如果您有多个问题,请发布多个问题,每个问题都尽可能详细,包括您尝试过的内容(例如显示一些相关的代码),它是如何工作或不工作的,某些特定输入的预期和实际输出等。 。 – 2014-11-24 02:43:33

+0

这是一个旨在复制简单ftp的学校项目 – LBBLITZ54 2014-11-24 02:43:35

+0

您是否真的想要重新实现TCP/SCTP?我非常怀疑这是在一个学校任务的范围内。 – 2014-11-24 02:58:19

回答

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 

我终于在顶部删除了冗余输入(“Client:”)。 特别感谢@JoachimPileborg的帮助,但我必须把它交给小家伙,因为这是我最终走上的道路。

0

问题1:发送ACK,你可以复制你有什么在相反的方向。

0

由于UDP是无连接的,你不知道你事先收到一个数据包,其中包将从何而来,所以你必须使用recvfrom获得两个包同行(地址/端口)的数据包来自。然后你必须使用该地址发回数据。

你现在正在你的客户端中做什么(但真正看起来像服务器)在循环中发送相同的数据一遍又一遍自己。相反,在循环中,您应该使用之前提到的recvfrom接收数据包,然后将回复发送给您收到数据包的对等方。

因此,像下面代码

while True: 
    peer = recvfrom(...) 
    sendto(..., peer) 
+0

ahhh我明白你的意思,他们看起来交换了,我怎么把客户端发回给客户端。我会尝试做一些洗牌,并尝试recvfrom()我一直在使用它,但开始认为它们是相同的 – LBBLITZ54 2014-11-24 03:23:54

+0

你可能会更具体的语法这个。我很喜欢python,并以几种方式尝试了这种方法,但似乎无法得到它。 – LBBLITZ54 2014-11-24 04:43:14