Bonjour,
Je commence la programmation réseau en python, et j'aimerais utiliser le module socketserver, qui aide pour créer un serveur. Mon serveur est un serveur TCP qui reçoit un certain nombre de connexions, et je voudrais qu'il stocke les socket des utilisateurs pour pouvoir ensuite comuniquer avec eux en mode connecté, pas de reconnexion des clients. Voici le code serveur que j'utilise :
Et le client :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 #! /usr/bin/env python3.1 # -*- coding: utf-8 -*- import socketserver import socket socks = [] LEN = 0 class EcouteHandler(socketserver.BaseRequestHandler): def handle(self): # réception du pseudo pseudo = self.request.recv(1024).decode("utf8") socks.append((self.request,pseudo)) print("socks : ", socks) if __name__ == "__main__": HOST, PORT = "localhost", 9999 # Création du serveur d'écoute des joueurs sur le port 9999 server = socketserver.TCPServer((HOST, PORT), EcouteHandler) # réception des joueurs while LEN < 2 : server.handle_request() LEN += 1 # fermeture de la socket d'écoute server.socket.close() print(socks)
Le problème est que dès que je sors de la méthode handle() de la classe EcouteHandler, la socket du client en fermée. Elle reste ouverte tant que l'on est dans handle et se ferme juste après. J'ai lu que les sockets sont fermées par le garbage collector mais je ne pense pas qu'il soit appelé ici, puisque je copie mes sockets dans la liste globale. De plus, coté client, je reçois continuellement des "paquets" du serveur qui sont vides (de taille = 0), ce qui indique je crois que la socket a été fermée de l'autre côté (je ne suis pas sur de ça, et je ne comprends pas pourquoi j'en reçois en continu et pas un seul). J'aimerai évidemment que ses sockets restent ouvertes après la sortie de handle (ou au moins comprendre pourquoi elles se ferment).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 #! /usr/bin/env python3.1 # -*- coding: utf-8 -*- import socket import sys if len(sys.argv) < 2: print("usage : %s pseudo" % sys.argv[0]) sys.exit(1) HOST, PORT = "localhost", 9999 pseudo = sys.argv[1] # Create a socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Connect to server and send data sock.connect((HOST, PORT)) sock.send(bytes(pseudo,"utf8")) print("Attente de directive") # Receive data from the server while True: received = sock.recv(1024) print("reçu : %s, %s" % (len(received), received)) sock.close()
Info : j'utilise python 3.1 sous ubuntu karmic, version des dépots.
Merci d'avance
Partager