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

标签 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 仍在其 socket 中!这就是为什么当它打印 recv_data 时,它打印响应 1。另一方面,客户端没有打印 recv_data,因为客户端还没有收到它 - 它仍然在服务器套接字的缓冲区中。

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

最佳答案

您必须发送到地址而不是地址。

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)

关于Python UDP 客户端/服务器程序,问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9862762/

相关文章:

python - 如何将xml文件保存到磁盘?

c - 在同一个套接字上发送和接收

.net - Socket.Receive(byte [])是否将仅返回一个UDP数据包?

c - c中的非阻塞套接字

java - log4j 1.2.17 + MDC + UDP

python - 为什么我需要提供一个空列表来使用 sum() 合并列表?

python - 如何在打印语句后取消换行符?

python - 如何使用 kubernetes 和 skaffold 调试 python 代码?

c++ - Boost asio udp套接字发送到不同的IP地址

sockets - 这个数字在http header 和内容的中间是什么意思