MagPI 10 Page 35

De Le French MagPi
Aller à : Navigation, rechercher
def initialise(self):
  try:
    self.sock.bind((self.host, self. port))
  except socket.error:
    return
self.sock.listen(5) self.server_thread = threading.Thread(target=self.serve_forever) self.server_thread.setDaemon(True) self.server_thread.start() print "Server running on %s and listening on %d" % (self.host, self.port)
def serve_forever(self): try: request, client_address = self.sock.accept() except socket.error: return
self.client_sockets.append(request) print "Received connection from " , client_address

Pour démarrer le serveur simple, ouvrez un shell python et tapez:

from SimpleServer import SimpleServer
import socket
server = SimpleServer("192.168.1.3" , 20000)
server.initialise()

Ensuite, allez sur l'autre Raspberry Pi, ouvrez un shell python et tapez:

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("192.168.1.3", 20000)) # L'adresse IP de la machine serveur
sock.close()

Maintenant, regardez sur la machine serveur. Le serveur signale que le client s'est connecté à lui.

Dans le programme donné en exemple, l'adresse du serveur est utilisée explicitement lors du démarrage du serveur, car le nom d'hôte d'un Raspberry Pi utilisant un DHCP se résout à l'adresse locale 127.0.0.1. Si le nom d'hôte du serveur est associé à une adresse sur le réseau local, alors la commande socket.getfqdn() peut être utilisée à la place de "192.168.1.3".

La classe SimpleServer contient plusieurs variables membres qui sont initialisées dans le constructeur __ init__. Ces variables membres contiennent les valeurs pour le nom d'hôte, numéro de port, socket et connexions clientes. Le numéro de port doit être suffisamment élevé pour être accessible à un utilisateur non-root. Chaque serveur se lie à un numéro de port donné. Une fois le numéro de port utilisé, il ne peut pas être utilisé par un autre serveur. Par conséquent, le serveur doit être arrêté avant de pouvoir se reconnecter au même port. L'instanciation socket.socket(AF_INET, socket.SOCK_STREAM) crée un socket. AF_INET se réfère à la famille d'adresse, qui dans ce cas est une adresse IP. Il y a d'autres types de socket pour le Bluetooth. SOCK_STREAM est le type de socket, qui est un flux d'octets fiable basé sur une liaison connectée bidirectionnelle. Les noms de familles d'adresses disponibles et les types de socket sont également utilisés dans les bibliothèques standard C LINUX. La variable client_sockets est une liste qui mémorise chaque connexion cliente.

La classe SimpleServer contient deux autres fonctions membres initialise et serve_forever. La fonction initialise tente de se lier au socket alloué. Si cela réussit, elle configure le socket en écoute. Ensuite, un fil d'exécution est créé, qui exécute la fonction membre server_forever. Le fil est configuré comme démon et démarré. La fonction membre serve_forever est le processus d'écoute qui accepte les connexions des clients. Le socket client associé à une connexion est ensuite ajouté à la liste des sockets clients.

Le prochain article montrera comment envoyer et recevoir les commandes des clients, en utilisant des fils d'exécution pour chaque connexion associée.

Testé avec Python 2.7.3 (Raspbian) & 2.6.1 (OSX 10.6.8)

Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Boîte à outils