Нет того, который действительно применим.
я обсуждаю некоторые вопросы в моем , ответ на Является там php библиотекой для проверки адреса электронной почты? , это обсуждено также в распознавание Regexp адреса электронной почты трудно?
Короче говоря, не ожидайте, что единственный, применимый regex сделает надлежащее задание. И лучший regex проверит синтаксис, не законность электронного письма (jhohn@example.com корректен, но это, вероятно, возвратится...).
Я не любитель питонов, но функция, которая вас интересует, - это «выбрать». Это позволит вам наблюдать за несколькими сокетами и отключаться при возникновении активности на любом из них.
Вот пример python, который использует select .
Если вы действительно хотели быть ленивым (с точки зрения программиста , а не с точки зрения оценки), вы можете установить тайм-аут для блокирующего чтения и просто перебрать все свои Розетки; если истекает тайм-аут, данные недоступны. Функционально это похоже на то, что делает select
, но он забирает этот контроль у ОС и помещает его в ваше приложение.
Конечно, это означает, что по мере уменьшения времени сна , ваша программа приблизится к 100% загрузке ЦП, поэтому вы не будете использовать ее в производственном приложении. Хотя для игрушки это нормально.
Это будет выглядеть примерно так: (не тестировалось)
def server():
import sys, os, socket
port = 11116
host = ''
backlog = 5 # Number of clients on wait.
buf_size = 1024
NUM_SOCKETS = 10
START_PORT = 2000
try:
socket.setdefaulttimeout(0.5) # raise a socket.timeout error after a half second
listening_sockets = []
for i in range(NUM_SOCKETS):
listening_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listening_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
listening_socket.bind((host, START_PORT + i))
listening_socket.listen(backlog)
listening_sockets.append(listening_socket)
except socket.error, (value, message):
if listening_socket:
listening_socket.close()
print 'Could not open socket: ' + message
sys.exit(1)
while True:
for sock in listening_sockets:
try:
accepted_socket, adress = sock_socket.accept()
data = sock.recv(buf_size)
if data:
sock_socket.send('Hello, and goodbye.')
sock.close()
except socket.timeout:
pass
server()