2017-05-31 1 views
-1

J'ai écrit un script de chat de base Python en utilisant socket. Cela fonctionne, mais pas comme je le souhaiterais.mon chat python socket de base a quelques problèmes

Lorsque Client1 envoie msg, seulement après client2 envoie msg, client2 obtiendra le msg de client1, etc

Je sais qu'il ya bibliothèque appelée mscvrt quelque chose peut me aider, mais je ne sais pas comment utiliser il (un peu nouveau à ce sujet. Je sais aussi que je suis censé faire de la méthode receive ne bloque pas par la bibliothèque Select.

Comment puis-je utiliser l'entrée et la recv de ne pas ainsi le blocage?

C'est le code du serveur:

import socket 
import select 

server_socket = socket.socket() 
server_socket.bind(('0.0.0.0', 23)) 
server_socket.listen(5) 
open_client_sockets = [] 
messages_to_send = [] 

def send_waiting_messages(wlist): 
    for message in messages_to_send: 
     (client_socket1, data) = message 
     for new_socket in open_client_sockets: 
      if new_socket in wlist: 
      if new_socket is not client_socket1: 
       new_socket.send(data) 
       print 'msg sent' 
     messages_to_send.remove(message) 


while True: 
    rlist, wlist, xlist = select.select([server_socket] + open_client_sockets, open_client_sockets, []) 
    for current_socket in rlist: 
     if current_socket is server_socket: 
      (new_socket, address) = server_socket.accept() 
      open_client_sockets.append(new_socket) 
     else: 
      data = current_socket.recv(1024) 
      if data is not "": 
       messages_to_send.append((current_socket, data)) 

    send_waiting_messages(wlist) 

C'est le code client (très basique):

import socket 
import select 

my_socket = socket.socket() 
my_socket = socket.socket() 
my_socket.connect(('127.0.0.1', 23)) 
print('Welcome to the chat room . You can send messages here.') 
print('Choose a nickname.') 
nickname = raw_input() 
while True: 

    txt = raw_input() 
    my_socket.send('[' + nickname + ']: ' + txt) 
    print (my_socket.recv(1024)) 
+2

votre recv est seulement après votre envoi. Vous devriez les créer dans des fils séparés ou bien il les enverra toujours et seulement ensuite les recevront. – IsaacDj

+0

@IsaacDj Pouvez-vous expliquer comment, ou écrire le code s'il vous plaît? –

Répondre

0

Votre recv est seulement après votre envoi. Vous devriez les créer dans des fils séparés ou bien il les enverra toujours et seulement ensuite les recevront. Dans le client et le serveur, utilisez le threading module pour le chat asynchrone.

Cette question a été répondue here et dans beaucoup d'autres questions. Bonne chance.