【问题标题】:Strengthen python UDP server加强python UDP服务器
【发布时间】:2012-05-02 08:46:36
【问题描述】:

我是 python (2.6/2.7) 的初学者,一直致力于为现有的 python 应用程序创建网络服务。

我已经启动并运行了一个 UDP 服务器,它工作得非常好,但我正在寻求帮助,使其更加防弹。

这是我编写的基本代码,通常的标准样板:

import sys
import socket
from threading import Thread

def handleInput():
         sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
         sock.bind( ("127.0.0.1",5005) )
         # socket always binded?
         while True:
                 data, addr = sock.recvfrom(512)
                 # is 'data' usable?

t=Thread(target=handleInput)
t.daemon=True
t.start()
# can thread die?

首先,我知道套接字在某种意义上总是可用的,它不必监听,所以没有失败,你必须重新连接。这是正确的吗?

其次,recvfrom 返回数据的问题。是不是一个简单的 'if data : then' 来检查它是否有效?

第三,最后是线程。一根线能炸出来吗?如果它确实重新启动它的最佳方法是什么?

欢迎任何其他提示。

(注意:我不能使用外部库,例如twisted等)

【问题讨论】:

  • 你希望用上面的Thread 代码完成什么?就目前而言,除了简单地运行handleInput() 之外没有任何附加值,但整个脚本仍然会阻塞,直到完成一个客户端。您是否希望同时处理多个“客户”?
  • 这段代码将被注入到另一个python应用程序中,这就是线程的原因。至于并发,多个客户端的消息不会都排队吗?

标签: python network-programming udp robustness


【解决方案1】:

您的问题的一些答案:

  1. UDP 套接字是无连接的,因此“始终可用”。另请注意,UDP 消息长度限制为 65535 字节 IIRC。
  2. 数据只是一个字符串,其有效性取决于使用的协议。您的if data: ... 将作为接收某些东西的测试,但recvfrom() 调用无论如何都会阻塞,直到它接收到某些东西,所以这似乎是多余的。
  3. 我一般对 python 线程的可靠性一无所知。

我还会检查SocketServer 模块和关联的UDPServerclass - 这可能会更容易实现。 SocketServer 是 python 标准库的一部分。

【讨论】:

  • 理论上,IP 数据报的最大大小为 65535 字节,由 IP 标头中的 16 位总长度字段强加。对于 20 字节的 IP 报头和 8 字节的 UDP 报头,这在 UDP 数据报中最多保留 65507 字节的用户数据。然而,大多数实现提供的都少于这个最大值。
猜你喜欢
  • 2014-06-18
  • 2020-06-22
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多