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

2024-10-02 20:41:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个基本的客户机/服务器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

等等等等

在第一个循环之后,服务器再次循环并打印响应1。这意味着服务器所做的是接收请求1,向客户端发送响应1,循环。。。但在第二次循环之后,响应1仍在其套接字中!这就是为什么当它打印recv_数据时,它会打印响应1。另一方面,客户机没有打印recv_数据,因为客户机没有收到它-它仍然在服务器套接字的缓冲区中。

请帮助-我试过查看其他echo程序,但它们似乎都使用TCP,而且相当简单(我想我几乎遵循了相同的步骤)。我不知道为什么我的UDP程序不能工作。我试图查看sendall()调用,但它似乎只适用于TCP。


Tags: import程序服务器data客户机serveraddressrequest
3条回答

可能是服务器端的10号线

recv_data, addr = server_socket.recvfrom(2048)

应该是

recv_data, addr = server_socket.sendto(2048)

是吗?

我是个傻瓜。=P

你必须寄到地址而不是地址。

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

相关问题 更多 >