python3 пытается вызвать recv () в цикле и получает BlockingIOError - PullRequest
0 голосов
/ 05 июля 2019

Я впервые использую 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
...