2014-11-24 116 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