bonjour je vous addresse un tout dernier problème en ce qui concerne mon serveur de chat en python. Le serveur doit recevoir les messages des clients et les retransmètre à tous les autres clients connectés. Il devrait aussi afficher un message quand un client quitte le serveur mais il ne le fait pas et je ne sais pas pourquoi après de longues recherches infructueuses… C'est le premier problème. Deuxième: quand mon client se connecte il se deconnecte instantanement à cause du if not data: … mais je ne sais pas quoi mettre à la place car dans tous les tutoriels que j'ai vu les auteurs mettent cette condition.
J'espère que quelqu'un pourra m'aider… Bonne soirée à vous tous.
En annexe les code sources
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 | # required modules import sys import socket import select def client(): if (len(sys.argv) < 3): print('[usage] python client.py <hostname> <port>') sys.exit() HOST = str(sys.argv[1]) PORT = int(sys.argv[2]) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(2) # connect ot the host try: s.connect((HOST, PORT)) except: print('Unable to connect to the remote host: ' + HOST) sys.exit() print('You are now connected to the server, you can now started sending data') sys.stdout.write('<you> ') sys.stdout.flush() while 1: socket_list = [sys.stdin, s] read, write, in_error = select.select(socket_list, [], []) for sock in read: if sock == s: data = sock.recv(4096) if not data: print('\nDisconnected from the server') sys.exit() else: sys.stdout.write(data) sys.stdout.write('<you> ') sys.stdout.flush() else: _data = sys.stdin.readline() s.send(_data) sys.stdout.write('<you> ') sys.stdout.flush() if __name__ == '__main__': sys.exit(client()) |
et 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 | # required modules import sys # for exits import socket # to setup the server import select # to manage the receive function # main variables HOST = '127.0.0.1' PORT = 7786 RECV_BUFFER = 4096 USERS = [] def send(server , sock, data): for socket in USERS: if socket != server and socket != sock: try: socket.send(data) except: socket.close() if socket in USERS: USERS.remove(socket) def server(): try: server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((HOST, PORT)) server_socket.listen(10) USERS.append(server_socket) except socket.error: print('Unable to connect to the remote host...') sys.exit() print('*' * 60) print('server started: {0} : {1}'.format(HOST, PORT)) print('*' * 60) while 1: read, write, in_error = select.select(USERS, [], [], 0) for sock in read: if sock == server_socket: conn, addr = server_socket.accept() USERS.append(conn) print('New connected user ({0})'.format(addr)) start_data = ('[{0}:{0}]entered the chat-room' + '\n'.format(conn)) send(server_socket, sock, start_data) else: try: data = sock.recv(RECV_BUFFER) if data: send(server_socket, sock, '\r' + '<' + str(sock.getpeername()) + '>' + data) else: if sock in USERS: USERS.remove(sock) send(server_socket, sock, 'The user {0}, {0}) left the chatroom\n'.format(addr)) except: send(server_socket, sock, 'The user ({0}, {0}) left the chatroom\n'.format(addr)) continue server_socket.close() if __name__ == '__main__': sys.exit(server()) |
+0
-0