Enviar y recibir mensajes al mismo tiempo socket python

He estado trabajando en una simple sala de chat de Python Socket donde el cliente y el servidor pueden enviarse mensajes entre ellos. El problema que encontré fue que el servidor y el cliente solo pueden enviar un mensaje a la vez. Quiero que funcione como cualquier otra sala de chat, donde podría recibir un mensaje cuando esté enviando un mensaje, cualquier ayuda será de gran ayuda.

Servidor.py

import socket import sys s = socket.socket() host = socket.gethostname() print(" server will start on host : ", host) port = 8080 s.bind((host,port)) name = input(str("Please enter your username: ")) print("") print("Server is waiting for incoming connections") print("") s.listen(1) conn, addr = s.accept() print("Recieved connection") print("") s_name = conn.recv(1024) s_name = s_name.decode() print(s_name, "has joined the chat room") conn.send(name.encode()) while 1: message = input(str("Please enter your message: ")) conn.send(message.encode()) print("Sent") print("") message = conn.recv(1024) message = message.decode() print(s_name, ":" ,message) print("") 

Client.py

 import socket import sys s = socket.socket() host = input(str("Please enter the hostname of the server : ")) port = 8080 s.connect((host,port)) name = input(str("Please enter your username : ")) print(" Connected to chat server") s.send(name.encode()) s_name = s.recv(1024) s_name = s_name.decode() print("") print(s_name, "has joined the chat room ") while 1: message = s.recv(1024) message = message.decode() print(s_name, ":" ,message) print("") message = input(str("Please enter your message: ")) message = message.encode() s.send(message) print("Sent") print("") 

CaSper me ha dado el código del servidor donde varios clientes pueden conectarse al servidor, pero el problema ahora es que los clientes no pueden hablar entre ellos …

Esto se debe principalmente a que su cliente quiere s_name = s.recv(1024) , mientras que el servidor de CaSper no envía su nombre. Aquí hay una variante de su cliente (esperando host y puerto como argumentos de comando) que funciona con el servidor de CaSper y también aborda su problema original (el cliente solo puede enviar un mensaje a la vez ) mediante el uso de hilos separados:

 import socket import sys s = socket.socket() s.connect((sys.argv[1], int(sys.argv[2]))) name = input(str("Please enter your username : ")) print(" Connected to chat server") s.send(name.encode()) def receive_and_print(): for message in iter(lambda: s.recv(1024).decode(), ''): print(":", message) print("") import threading background_thread = threading.Thread(target=receive_and_print) background_thread.daemon = True background_thread.start() while 1: s.send(input("Please enter your message: ").encode()) print("Sent") print("") 

Tenga en cuenta que el servidor de CaSper tiene una serie de deficiencias:

  1. Incluso ahora que sus clientes pueden enviar mensajes en cualquier momento, el servidor espera un mensaje de uno a uno, es decir, cuando espera al cliente A, el cliente B puede enviar un mensaje, pero el servidor lo recibe y lo transmite solo después de que el cliente A ha enviado algo
  2. No maneja las desconexiones del cliente.
  3. Entra en un bucle ocupado cuando todos los clientes se desconectan.

Para un mejor ejemplo de servidor, vea la pregunta Manejar múltiples solicitudes con seleccionar .

… podrías posiblemente cambiar mi servidor para que funcione …

Aquí hay una variante de su servidor que funciona con este cliente, también utilizando hilos separados para entrada y recepción:

 import socket import sys s = socket.socket() host = socket.gethostname() print(" server will start on host : ", host) port = 8080 s.bind((host,port)) name = input(str("Please enter your username: ")) print("") print("Server is waiting for incoming connections") print("") s.listen(1) conn, addr = s.accept() print("Recieved connection") print("") s_name = conn.recv(1024) s_name = s_name.decode() print(s_name, "has joined the chat room") def input_and_send(): while 1: message = name+" : "+input(str("Please enter your message: ")) conn.send(message.encode()) print("Sent") print("") import threading background_thread = threading.Thread(target=input_and_send) background_thread.daemon = True background_thread.start() for message in iter(lambda: conn.recv(1024).decode(), ''): print(s_name, ":", message) print("") 

¿Intentó usar el módulo de subprocesamiento o el módulo de tiempo? Esto sucede porque ambos scripts envían mensajes al mismo tiempo. Pruebe Ex (mensaje de espera del cliente desde el servidor, luego el mensaje del cliente se envía al servidor).

Este es servidor

 import socket import threading as th def accept_client(): while True: # ACCEPTING cli_sock, cli_add = ser_sock.accept() uname = cli_sock.recv(1024) CONN_LIST.append((uname, cli_sock)) print('%s is now connected' %uname) def broadcast_usr(): while True: for i in range(len(CONN_LIST)): try: data = CONN_LIST[i][1].recv(1024) if data: b_usr(CONN_LIST[i][1], CONN_LIST[i][0], data) except Exception as x: print(x.message) break def b_usr(cs_sock, sen_name, msg): for i in range(len(CONNECTION_LIST)): if (CONN_LIST[i][1] != cs_sock): CONN_LIST[i][1].send(sen_name) CONN_LIST[i][1].send(msg) if __name__ == "__main__": CONN_LIST = [] # SOCKET ser_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # BINDING host = '192.168.xx' #LOCAL HOST port = 4444 ser_sock.bind((host, port)) # LISTENING ser_sock.listen(1) print('Chat server started on port : ' + str(port)) thread_ac = th.Thread(target = accept_client) thread_ac.start() thread_bs = th.Thread(target = broadcast_usr) thread_bs.start()