[英]How do I send UDP packets to the UDP server I have created in Python (3.7.3)?
請讓我開始說我是Python的新手(第一年的CS學生),這是我學習的第一門編程語言。
我的作業有兩部分; 客戶端和服務器
在服務器端,我試圖:
1)創建一個不斷等待UDP消息的服務器,並等待兩個不同的UDP消息(string1和string2)
2)然后它將2個數據包的字符串連接為string3,並在單個UDP數據包中將其發送到客戶端並再次啟動。
例如,server接收string1和string2作為pinea和pples,將pineapples構造為string3並將string3發送給客戶端
在客戶端,我需要編寫一些代碼:1)在啟動時提示客戶端輸入字符串#
2)將該字符串拆分為2(如果n為偶數則為n / 2,如果n為奇數則為(n + 1)/ 2和(n-1)/ 2)
3)在單獨的UDP數據包中等待來自服務器的字符串
4)檢查來自服務器的字符串是否是兩個拆分字符串的串聯
5)顯示最終答案的結果
例如,用戶輸入字符串作為菠蘿,客戶端發送string1和string2作為pinea和pples; 然后從服務器接收string3作為菠蘿,並檢查string3 == string1 + string2。
我試圖找出為什么在設置我的服務器后,我無法發送和從服務器發送數據包。
我目前正在使用Python IDLE 3.7.3,我觀看了不少視頻並閱讀了其他一些堆棧溢出論壇,但一直無法確定問題,如前所述,我是初學者,非常感謝任何幫助
這是我的代碼:
對於我有的服務器:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
address = ("127.0.0.1", 5002)
sock.bind (address)
while True:
data,addr= sock.recvfrom(1024)
print (data)
print (addr)
sock.listen(5)
我的客戶端代碼如下:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s=str(input("Please input a word: "))
string1 = s[:len(s)//2]
string2 = s[:len(s)//2:]
message1= string1.encode()
message2= string2.encode()
sock.sendto(message1+message1,("127.0.0.1",5002))
received= sock.recv(1024)
received==string1+string2
while True:
print (message1, message2)
print (received)
當我嘗試運行客戶端代碼時,我當前收到錯誤消息“遠程主機強行關閉現有連接”。
非常感謝(這也是我第一次使用Stack Overflow,所以如果我在帖子中做了任何不合適的事情,請告訴我,以便我能糾正)
你的代碼似乎是奇怪的結構, while
循環不順/做無意義的事情等等......
我整理/重寫了你的代碼,這對我有用。 我正在使用上下文管理器,以便很好地清理套接字。 對於服務器,類似於:
import socket
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
sock.bind(("127.0.0.1", 5002))
while True:
data, addr = sock.recvfrom(8192)
print(data, addr)
sock.sendto(b"hi from server", addr)
和客戶:
import socket
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
sock.connect(("127.0.0.1", 5002))
sock.send(b"hi from client")
print(sock.recvfrom(8192))
UDP顯然是“無連接”,但調用connect
允許執行一次名稱解析而不是每次send
。 我還硬編碼了為簡單起見而發送的消息。
調試時有助於消除盡可能多的復雜性,在這種情況下,讀取輸入似乎與網絡代碼幾乎無關。
我還建議使用socket.getaddrinfo
以便您的代碼可以更輕松地使用IPv6,但這是一個單獨的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.