Python UDP客户端/服务器程序,问题

时间:2012-03-25 18:23:04

标签: python sockets udp

我正在尝试编写一个基本的客户端/服务器回显程序,以基于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。

3 个答案:

答案 0 :(得分:14)

你必须发送到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)

答案 1 :(得分:2)

这里发生的事情是服务器正在向'Response 1'发送localhost:6005,然后在localhost:6005收听时立即收到它。

服务器绑定并侦听其(address, port),这是正确的。当客户端首先连接而没有绑定时,会自动为其分配一个未使用的(address, port)。您需要确定客户端正在使用的(address, port)才能对其进行响应 - 通过bind明确设置已知(address, port),或使用addrrecvfrom返回。

答案 2 :(得分:1)

可能是服务器端的第10行

  

recv_data,addr = server_socket.recvfrom(2048)

应该是

  

recv_data,addr = server_socket.sendto(2048)

PS&GT;我是一个菜鸟。 = P