2012-05-02 3 views
4

Я новичок в python (2.6/2.7), который был брошен в глубину, чтобы создать сетевую службу для существующего приложения python.Усиление UDP-сервера 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. Это просто ', если данные: then', чтобы проверить, действительно ли это?

В-третьих, и, наконец, нить. Может ли выпустить нить? Если это действительно лучший способ перезапустить его?

Любые другие советы приветствуются.

(Примечание: Я не могу использовать внешние библиотеки, например, скрученные и т.д.)

+1

Что вы надеетесь выполнить с помощью кода «Thread» выше? Как бы то ни было, добавленная стоимость не добавляется помимо простого запуска 'handleInput()', но весь сценарий будет по-прежнему блокироваться, пока не будет завершен с одним клиентом. Вы надеетесь одновременно работать с несколькими «клиентами»? –

+0

Этот код будет введен в другое приложение python, это причина для потока. Что касается параллелизма, не будут ли очереди сообщений от нескольких клиентов в очереди? – kingsaul

ответ

4

Некоторые ответы на вопросы:

  1. UDP сокеты без установления соединения, и как таковой «всегда доступен». Также имейте в виду, что длина сообщения UDP ограничена 65535 байтами IIRC.
  2. Данные - это всего лишь строка, и ее действие будет зависеть от используемого протокола. Ваш if data: ... будет работать как тест для получения чего-либо, но вызов recvfrom() будет блокировать так или иначе, пока он не получит что-то, поэтому это кажется излишним.
  3. Я вообще не знаю о надежности потоков python.

Я хотел бы также проверить SocketServer модуль и соответствующий UDPServer класса - это может сделать для облегчения реализации. SocketServer является частью стандартной библиотеки python.

+1

Теоретически максимальный размер IP-дейтаграммы составляет 65535 байт, наложенных 16-разрядным полем общей длины в заголовке IP. С IP-заголовком в 20 байт и UDP-заголовком в 8 байтов это оставляет максимум 65507 байтов пользовательских данных в дейтаграмме UDP. Однако большинство реализаций обеспечивают меньше этого максимума. –

Смежные вопросы