Я впервые использую Python (3.7.3) и пытаюсь создать чат-сервер, который получает сообщение от клиента и отправляет его всем остальным клиентам.
проблема в том, что при использовании recv(),
он посылает мне каждый отдельный символ отдельно.
Как я могу исправить эту проблему?
Я написал функцию recv_line
, которая предполагает получение символов до тех пор, пока пользователь не нажмет ввод:
import selectors
import socket
import sys
if len(sys.argv) != 4:
print("Correct usage: python3 ChatServer.py IP_address port
Clients_number")
exit()
BUFFER_SIZE = 1024
host = str(sys.argv[1])
port = int(sys.argv[2])
clients_num = int(sys.argv[3])
sel = selectors.DefaultSelector()
connections = []
def read(conn, mask):
data = recv_line(conn)
if data:
print(repr(conn.getpeername()), 'sent', repr(data))
broadcast(conn, data)
else:
print('closing', conn)
sel.unregister(conn)
conn.close()
connections.remove(conn)
def recv_line(conn):
total_data = ""
while True:
data = conn.recv(BUFFER_SIZE)
if data:
total_data += data.decode('utf8')
if '\n' == data:
return total_data.encode('utf8')
else:
return 0
def accept(sock, mask):
conn, addr = sock.accept()
print('accepted connection from', addr)
connections.append(conn)
conn.setblocking(False)
sel.register(conn, selectors.EVENT_READ, read)
notify_clients_about_new_entry(conn, addr
sock = socket.socket()
sock.bind((host, port))
sock.listen(clients_num)
sock.setblocking(False)
sel.register(sock, selectors.EVENT_READ, accept)
while True:
events = sel.select()
for key, mask in events:
callback = key.data
callback(key.fileobj, mask)
вместо того, чтобы получать полное сообщение, а не только один символ за раз, я получаю сообщение об ошибке, когда клиент начинает писать:
File "C:/Users/USER/Desktop/pycharmProjects/ChatServer.py", line 27, in recv_line
data = conn.recv(BUFFER_SIZE)
BlockingIOError: [WinError 10035] A non-blocking socket operation could not be completed immediately