簡體   English   中英

如何將UDP數據包發送到我在Python(3.7.3)中創建的UDP服務器?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM