bonjour, je travaille sur la réalisation d'un serveur de chat très basique pour le moment en python. Le but de ce serveur est qu'il reçois les données du client et les transmette à tous les autres clients connectés.
Pour cela j'ai utilisé les classes et me suis inspiré de pas mal de tutoriels en anglais sur internet.
Code du serveur:
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | import socket import sys import select # main variables _HOST = '127.0.0.1' # remote host _PORT = 9979 # remote port _BUFFER = 4096 # max buffering _RUNNING = True # Running variable for the loop while... _USERS = [] class chat_server(): # chat_server as an object def __init__(self): self.host = _HOST self.port = _PORT self.run = _RUNNING self.buff = _BUFFER self.users = _USERS def bind(self): # setting up the server to listen to 5 incoming connections """ Setup and start the server """ try: self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.bind((self.host, self.port)) self.sock.listen(5) self.users.append(self.sock) sys.stdout.write(('Chat server started : {0} ; {1}').format(self.host, self.port)) except socket.error: sys.stdout.write(('Unable to connect to the remote host : {0}').format(self.host)) sys.exit() def send(self, server, sender, data): """ encode and send the input data to every clients """ for sock in self.users: # send the lessage if sock != server and sock != sender: try: data = data.encode() self.sock.send(data) except: # broken socket connection self.sock.close() if sock in self.users: self.users.remove(sock) def stop(self): self.run = False self.sock.close() def main(self): """ Principal function of the class chat_server() setup and runs the server actually """ self.bind() while self.run: try: ready_to_read, ready_to_write, in_error = select.select(self.users, [], [], 60) except socket.error: continue else: for sock in ready_to_read: if sock == self.sock: try: client_socket, client_address = self.sock.accept() except socket.error: break else: self.users.append(client_socket) print('Client (%s, %s) connected' % client_address) # Notifies all connected users that a new one entered the chatroom self.send(self.sock, client_socket, "\n[%s:%s] entered the chatroom\n" % client_address) else: try: data = sock.recv(self.buff) if data: self.send(self.sock, sock, "\r" + '<' + str(sock.getpeername()) + '>' + data) except socket.error: self.send(self.socket, sock, '\nClient (%s, %s) is offline\n' % client_address) print('Client (%s, %s) is offline' % client_address) self.users.remove(sock) continue self.stop() if __name__ == '__main__': chat_srv = chat_server() chat_srv.main() |
et le code du client:
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | import socket _HOST = '127.0.0.1' _PORT = 9979 _BUFFER = 4096 _RUNNING = True class chat_client(): def __init__(self): self.host = _HOST self.port = _PORT self.buff = _BUFFER self.run = _RUNNING def connect(self): try: self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.connect((self.host, self.port)) except socket.error: print(('Unable to connect to the remote host : {0}').format(self.host)) def send(self, data): _data = data.encode() try: self.send(_data) except socket.error: print(('Unable to send the remote message: {0}').format(data)) def main(self): while self.run: data = raw_input('<you> ') try: self.send(data) except socket.error: print(('Unable to send this message: {0}').format(data)) data_recv = self.sock.recv(4096) if data_recv: data = data.decode() print(data) if __name__ == '__main__': chat_clt = chat_client() chat_clt.main() |
voilà, donc je viens vers vous car j'obtient deux erreurs, quand je run le client et qu'il se connecte au serveur, le serveur n'affiche pas le message qui devrait dire qu'un client est arrivé et deuxième c'est que quand j'envoie un message à partir du script du client, le terminal me dit que la limite d'envoi de message à été rejointe et renvoie une erreur en sortie, je pense que c'est à cause de la boucle while True mais n'arrive pas à placer correctement mon self.send…
Voilà, si vous avez des conseils pour améliorer mon code ou vous avez la solution aux problèmes, merci de me donner une réponse. bonne fin de soirée.