簡體   English   中英

Python UDP客戶端/服務器程序,問題

[英]Python UDP client/server program, problems

我正在嘗試編寫一個基本的客戶端/服務器echo程序,以基於select()來測試定時器的重傳用法(盡管我不得不注釋掉那個位以簡化調試,當它沒有按預期工作時)。 以下是相關代碼的片段:

服務器:

from socket import *
import sys
import select
address = ('localhost', 6005)
server_socket = socket(AF_INET, SOCK_DGRAM)
server_socket.bind(address)

while(1):
    print "Listening"
    recv_data, addr = server_socket.recvfrom(2048)
    print recv_data
    if recv_data == "Request 1" :
        print "Received request 1"
        server_socket.sendto("Response 1", address)
    elif recv_data == "Request 2" :
        print "Received request 2"
        data = "Response 2"
        server_socket.sendto(data, address)

客戶:

from socket import *
import sys
import select

address = ('localhost', 6005)
client_socket = socket(AF_INET, SOCK_DGRAM)

num_retransmits = 0
while(num_retransmits < 60):
    num_retransmits = num_retransmits + 1


    data = "Request 1"
    client_socket.sendto(data, address)
    print "Sending request 1"

    recv_data, addr = client_socket.recvfrom(2048)

    print recv_data, "!!"

客戶端上的輸出只是“發送請求1”,當在recvfrom調用或其以下的任何內容上使用斷點時,它不會到達斷點。 所以我認為客戶端沒有收到任何東西,並且堅持到最后。 另一方面,服務器上的輸出是:

  • 聽力
  • 要求1
  • 收到請求1
  • 聽力
  • 回應1

等等等等

在第一個循環之后,服務器再次循環並打印RESPONSE 1.這意味着服務器所做的是接收請求1,將響應1發送到客戶端,循環...但是在第二次循環之后,響應1仍然是STILL在它的插座! 這就是為什么當它打印recv_data時,它打印響應1.另一方面,客戶端不打印recv_data,因為客戶端沒有收到它 - 它仍然在服務器套接字的緩沖區中。

請幫助 - 我已經嘗試過查看其他echo程序,但它們似乎都使用TCP並且相當簡單(我想我幾乎遵循了相同的步驟)。 我不知道為什么我的UDP程序不起作用。 我試着查看sendall()調用,但它似乎只適用於TCP。

你必須發送到addr而不是地址。

from socket import *
import sys
import select
address = ('localhost', 6005)
server_socket = socket(AF_INET, SOCK_DGRAM)
server_socket.bind(address)

while(1):
    print "Listening"
    recv_data, addr = server_socket.recvfrom(2048)
    print recv_data
    if recv_data == "Request 1" :
        print "Received request 1"
        server_socket.sendto("Response 1", addr)
    elif recv_data == "Request 2" :
        print "Received request 2"
        data = "Response 2"
        server_socket.sendto(data, addr)

這里發生的是服務器發送'Response 1'localhost:6005 ,然后立即收到它,因為它也在localhost:6005上偵聽。

服務器綁定並偵聽其(address, port) ,這是正確的。 當客戶端首先連接而沒有綁定時,會自動為其分配一個未使用的(address, port) 您需要確定客戶端正在使用什么(address, port)以響應它 - 通過bind來顯式設置已知(address, port) ,或者使用recvfrom返回的addr

可能是服務器端的第10行

recv_data,addr = server_socket.recvfrom(2048)

應該

recv_data,addr = server_socket.sendto(2048)

ps>我是一個菜鳥。 = P

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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