我正在尝试编写一个基本的客户端/服务器回显程序,用于测试基于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, "!!"
客户端的输出仅为“Sending request 1”,当在recvfrom调用以下的任何位置设置断点时,它都不会到达断点。因此,我认为客户端没有收到任何东西,并一直等待直到收到消息。另一方面,服务器上的输出是:
- Listening
- Request 1
- Received request 1
- Listening
- Response 1
之后再次循环,服务器循环并打印RESPONSE 1。这意味着服务器所做的是接收请求1,将响应1发送给客户端,然后循环...但在它第二次循环后,响应1仍然保存在其套接字中!这就是为什么当它打印recv_data时,它会打印响应1。另一方面,客户端没有打印recv_data,因为客户端还没有收到它 - 它仍然在服务器套接字的缓冲区中。
请帮忙看看 - 我已经尝试查看其他回显程序,但它们似乎都使用TCP并且非常简单(我认为我已经遵循了相同的步骤)。我不知道为什么我的UDP程序无法工作。我尝试查看sendall()调用,但它似乎只适用于TCP。