Почему клиент 2 зависает, когда клиент 1 отправляет данные?

Как можно модифицировать данный скрипт на языке Python, чтобы избежать зависания при приеме информации в функции inf() при работе одновременно с двумя клиентами?
  • 18 февраля 2024 г. 14:58
Ответы на вопрос 2
Вероятно, клиент 2 зависает из-за блокировки чтения данных в функции `inf()` при работе с клиентом 1. 

Для избежания зависания при приеме информации в функции `inf()`, можно воспользоваться механизмом многопоточности или асинхронности. 

Пример модифицированного скрипта с использованием многопоточности:

```python
import socket
import threading

def inf(client, addr):
    while True:
        data = client.recv(1024)
        if not data:
            break
        print(f"Received data from {addr}: {data.decode()}")
    
    print(f"Connection with {addr} closed")

def main():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('0.0.0.0', 8888))
    server_socket.listen(2)

    while True:
        client, addr = server_socket.accept()
        print(f"Connected to {addr}")

        thread = threading.Thread(target=inf, args=(client, addr))
        thread.start()

if __name__ == "__main__":
    main()
```

В данном примере каждое новое соединение обрабатывается в отдельном потоке, что позволяет избежать блокировки при работе с несколькими клиентами одновременно.

Если вы хотите использовать асинхронность, то можно воспользоваться библиотекой `asyncio`. Для этого необходимо модифицировать код соответствующим образом.
Скорее всего сервер отправляет единственный пакет данных, который меньше 1024 байт. 
Вот и получается, что ты дважды читаешь из сокета, но все данные уже получаешь при первом вызове и блокируешься навсегда.

В случае 1 клиента, то ты постоянно читаешь очередной чанк и устанавливаешь новое соединение. Попробуй убрать

text=client2.recv(1024).decode('utf-8')
print(text)
Похожие вопросы