dernierpost pour socket serveur en PYTHON

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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())

Édité par backtrack_05

+0 -0

Cette réponse a aidé l'auteur du sujet

Je n'ai pas tout lu et ne connais pas python, mais pourquoi exclure si il n'y pas de données ? En général dans un chat, tous les clients restent connectés et reçois des données quand il y en a, si il y en a pas il reste à écouter en attendant un potentiel message. Pour les déconnexions, on peut utiliser un message du style "DISCONNECT", que le client envoie pour expliquer qu'il ferme la connexion. Et un système de time out pour déconnecter et fermer la connexion avec le client et le serveur si l'un des deux ne répond pas après X secondes. IRC utilise un système de "PING-PONG" pour le time out, tu peux t'inspirer de ce protocole pour écrire ton programme.

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte