Je suis nouveau sur python et je voulais en savoir plus sur les sockets.

J'ai 2 scripts de test:

# server
import socket

connectionListener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

connectionListener.bind(('', 8600 ))
connectionListener.listen(200)

while 1:
    #accept connections from outside
    (clientsocket, address) = connectionListener.accept()
    #now do something with the clientsocket
    #in this case, we'll pretend this is a threaded server
    print clientsocket.recv(64)
    print 'Boom!'

Et:

#client
import socket

connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

connection.connect(('localhost', 8600))
connection.send('hello world!')

Le comportement d'une boucle à laquelle je suis habitué est de spammer la chaîne Boom! à l'infini. Mais ce n'est pas le cas! Alors que la boucle ressemble plus à un événement déclenché?
Boom! et hello world! ne sont imprimés qu'au moment de la connexion. Comment ça marche?

Quand je pars seulement

while 1:
    print 'Boom!'

Il se comporte "normalement" (à ce que je sais) Puis-je et comment puis-je contrôler le comportement de la boucle?

0
Grzegorz 12 juil. 2015 à 21:57

2 réponses

Meilleure réponse

socket.accept se bloque jusqu'à ce qu'une nouvelle connexion soit établie. Si vous souhaitez voir "Boom" imprimé à plusieurs reprises, vous devez mettre à jour votre code client à plusieurs reprises sur connect, send et close. Sinon, votre serveur se bloquera à la deuxième itération en attendant une nouvelle connexion.

Faites quelque chose comme ça:

#client
import socket

connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

while True:
    connection.connect(('localhost', 8600))
    connection.send('hello world!')
    connection.close()
2
matthewatabet 12 juil. 2015 à 19:09

La raison pour laquelle vous ne serez pas spammé avec "Boom!" lignes est que les sockets sont bloquants par défaut. Cela signifie que socket.recv() arrêtera l'exécution jusqu'à ce que quelque chose ait été reçu. Ainsi, pendant que vous utilisez une boucle while, la boucle n'est pas répétée indéfiniment car la ligne recv() l'arrête.

Vous pouvez contrôler ce comportement à l'aide de socket.setblocking, et il est également possible de configurer le socket pour que les méthodes de blocage expirent, afin qu'elles ne bloquent pas pour toujours. Vous voudriez faire ce dernier si vous étiez dépendant de quelque chose d'autre fonctionnant en parallèle, mais si votre programme n'est là que pour consommer le socket, le bloquer pour toujours est très bien, et en fait un bon moyen de garder votre processeur libre.

2
poke 12 juil. 2015 à 19:08