mis*_*han 10 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)
Run Code Online (Sandbox Code Playgroud)
客户:
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, "!!"
Run Code Online (Sandbox Code Playgroud)
客户端上的输出只是"发送请求1",当在recvfrom调用或其以下的任何内容上使用断点时,它不会到达断点.所以我认为客户端没有收到任何东西,并且坚持到最后.另一方面,服务器上的输出是:
等等等等
在第一个循环之后,服务器再次循环并打印RESPONSE 1.这意味着服务器所做的是接收请求1,将响应1发送到客户端,循环...但是在第二次循环之后,响应1仍然是STILL在它的插座!这就是为什么当它打印recv_data时,它打印响应1.另一方面,客户端不打印recv_data,因为客户端没有收到它 - 它仍然在服务器套接字的缓冲区中.
请帮助 - 我已经尝试过查看其他echo程序,但它们似乎都使用TCP并且相当简单(我想我几乎遵循了相同的步骤).我不知道为什么我的UDP程序不起作用.我试着查看sendall()调用,但它似乎只适用于TCP.
小智 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36536 次 |
| 最近记录: |