Comment rendre le serveur accepte les connexions à partir de plusieurs ports?
Comment puis-je faire un simple serveur(simple comme dans l'acceptation d'une connexion et d'impression à la borne de tout ce qui est reçu) accepter la connexion à partir de plusieurs ports ou une plage de ports?
Dois-je utiliser plusieurs threads, un pour chaque appel de liaison. Ou est-il une autre solution?
La simple serveur peut ressembler à quelque chose comme ça.
def server():
import sys, os, socket
port = 11116
host = ''
backlog = 5 # Number of clients on wait.
buf_size = 1024
try:
listening_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listening_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
listening_socket.bind((host, port))
listening_socket.listen(backlog)
except socket.error, (value, message):
if listening_socket:
listening_socket.close()
print 'Could not open socket: ' + message
sys.exit(1)
while True:
accepted_socket, adress = listening_socket.accept()
data = accepted_socket.recv(buf_size)
if data:
accepted_socket.send('Hello, and goodbye.')
accepted_socket.close()
server()
EDIT:
Ceci est un exemple de la façon dont il peut être fait. Merci à tous.
import socket, select
def server():
import sys, os, socket
port_wan = 11111
port_mob = 11112
port_sat = 11113
sock_lst = []
host = ''
backlog = 5 # Number of clients on wait.
buf_size = 1024
try:
for item in port_wan, port_mob, port_sat:
sock_lst.append(socket.socket(socket.AF_INET, socket.SOCK_STREAM))
sock_lst[-1].setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sock_lst[-1].bind((host, item))
sock_lst[-1].listen(backlog)
except socket.error, (value, message):
if sock_lst[-1]:
sock_lst[-1].close()
sock_lst = sock_lst[:-1]
print 'Could not open socket: ' + message
sys.exit(1)
while True:
read, write, error = select.select(sock_lst,[],[])
for r in read:
for item in sock_lst:
if r == item:
accepted_socket, adress = item.accept()
print 'We have a connection with ', adress
data = accepted_socket.recv(buf_size)
if data:
print data
accepted_socket.send('Hello, and goodbye.')
accepted_socket.close()
server()
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas un python gars, mais la fonction qui vous intéresse est "select". Cela vous permettra de regarder des prises multiples et les pauses lorsque l'activité se produit sur l'un d'eux.
Voici un exemple python qui utilise sélectionnez.
Depuis le Python a beaucoup de frais généraux, multithread apps sont un gros point de débat. Ensuite, il y a tout blocage de fonctionnement-GIL question aussi. Heureusement, le Python devise de "Si cela ressemble à un gros problème, quelqu'un est probablement déjà trouvé une solution (ou plusieurs!)" vrai ici. Ma solution préférée tend à être la microthread modèle, plus précisément
gevent
.Gevent est un événement piloté par un thread unique de la simultanéité de la bibliothèque qui gère la plupart des problèmes pour vous sortir de la boîte via le singe de correction.
gevent.monkey.patch_socket()
est une fonction qui remplace la prise d'appels avec les non-blocage de variantes, d'interrogation et de sommeil pour permettre le passage à d'autres greenlets en tant que de besoin. Si vous voulez plus de contrôle, ou il n'est pas de coupe c'est pour vous, vous pouvez facilement gérer la commutation de la sélectionner et degevent
's de la coopérative de rendement.Voici un exemple simple.
Ce serait un super-simple, complètement non testé serveur portion de texte brut
We got your message!
sur les ports 1024-2048. Impliquant select est un peu plus difficile; vous devez avoir un gestionnaire de greenlet qui appelle sélectionnez-la, puis démarre actifs; mais ce n'est pas massivement difficile à mettre en œuvre.Espérons que cette aide! La belle partie de l'greenlet base de la philosophie, c'est que l'appel à select est en fait une partie de leur hub module, comme je le rappel, ce qui vous permettra de créer un beaucoup plus évolutif et complexe serveur plus facilement. C'est assez efficace aussi; il ya un couple de repères flottant autour.
Si tu voulais vraiment être paresseux (à partir d'un programmeur point de vue, non pas une évaluation du point de vue de), vous pouvez définir un délai d'attente sur votre blocage lire et juste une boucle sur toutes vos prises de courant; si un délai d'attente se produit, il n'y avait pas de données disponibles. Fonctionnellement, ce qui est similaire à ce que l'
select
est en train de faire, mais il est de prendre le contrôle à l'écart de l'OS et de le mettre dans votre application.Bien sûr, cela implique que votre temps de sommeil diminue, votre programme s'approche de 100% d'utilisation du PROCESSEUR, de sorte que vous n'utilisez pas sur une production de l'app. C'est bien pour un jouet bien.
Ce serait quelque chose comme ceci: (pas testé)