[PYTHON] Créer un chat en utilisant socket

Vous pouvez trouver un programme de chat python sur la ligne de commande qui n'est pas une application Web. Cependant, aucun d'entre eux (ceux qui peuvent entrer de manière asynchrone) ne fonctionne sous Windows. Pour le moment, j'ai fait quelque chose qui fonctionne, donc je vais le publier.

Programme serveur

Commencez par "python server.py IP address"

server.py


import sys, socket, select
 
def broadcast(socklist, server_socket, sock, message):
    print(message)
    for socket in socklist:
        if socket != server_socket and socket != sock :
            try :
                socket.send(message.encode())
            except :
                socket.close()
                socklist.remove(socket)
 
if __name__ == '__main__':
    port, socklist, server = 5001, [], '127.0.0.1' if len(sys.argv) <= 1 else sys.argv[1]
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((server, port))
    server_socket.listen(10)
    socklist.append(server_socket)
    print('Start')
    while True:
        read_sockets, write_sockets, error_sockets = select.select(socklist, [], [])
        for sock in read_sockets:
            if sock == server_socket:
                sockfd, addr = server_socket.accept()
                socklist.append(sockfd)
                broadcast(socklist, server_socket, sockfd, '[%s:%s] Enter' % addr)
            else:
                try:
                    data = sock.recv(4096).decode()
                    if data == '': raise Exception('Done')
                    if data:
                        broadcast(socklist, server_socket, sock, data)                
                except Exception as e:
                    print(e)
                    broadcast(socklist, server_socket, sock, '[%s, %s] Exit' % addr)
                    sock.close()
                    socklist.remove(sock)

Programme client

Exécuter en tant que "adresse IP du nom d'utilisateur python client.py"

client.py


import sys, socket, select, threading
 
def prompt(user) :
    sys.stdout.write('%s> ' % user)
    sys.stdout.flush()
 
if __name__ == "__main__":
    if len(sys.argv) < 3:
        print('Usage : python %s user host' % sys.argv[0])
        sys.exit()
    (user, host), port = sys.argv[1:3], 5001
    server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try :
        server_sock.connect((host, port))
    except :
        print('Unable to connect')
        sys.exit()
    print('Start')
    def listen():
        while True:
            read_sockets, write_sockets, error_sockets = select.select([server_sock], [], [])
            try:
                data = server_sock.recv(4096).decode()
            except:
                break
            sys.stdout.write('\r%s\n' % data)
            prompt(user)
        print('\rTerminated')
    t = threading.Thread(target=listen)
    t.start()
    prompt(user)
    while True:
        msg = sys.stdin.readline().strip()
        if not msg:
            server_sock.close()
            break
        try:
            server_sock.send(('%s| %s' % (user, msg)).encode())
        except:
            break
        prompt(user)

Dans la série Python2, seul ASCII est OK.

Recommended Posts

Créer un chat en utilisant socket
Création de vecteurs de phrases avec BERT (Keras BERT)
Créer un chat en utilisant socket
Liste de contrôle à l'aide de l'arborescence des cases à cocher → Création de texte
Création de vecteurs de phrases avec BERT (Keras BERT)
Création automatique d'horaire de travail à l'aide de la recherche tabou
Création de graphique Excel à l'aide de python xlwings
Création d'interface graphique en python avec tkinter 2
Création d'interface graphique en python à l'aide de tkinter partie 1
Création d'animation flexible à l'aide de l'animation.FuncAnimation de matplotlib
Création d'un classificateur négatif / positif à l'aide de BERT