Как создать сервер с поддержкой множества соединений?

Как правильно сохранять данные подключения к серверу (хост:порт) в массиве после их принятия?
Изображение к вопросу
  • 10 февраля 2024 г. 21:48
Ответы на вопрос 2
Для создания сервера с поддержкой множества соединений можно воспользоваться разными подходами в зависимости от технологии и языка программирования. Покажу пример на языке Python с использованием стандартной библиотеки `socket` для создания простого TCP-сервера.

```python
import socket
import threading

# Функция для обработки подключения клиента
def handle_client(client_socket, client_address):
    print(f"Подключился клиент {client_address}")
    
    # Принимаем данные от клиента (в цикле, если надо получать данные постоянно)
    while True:
        data = client_socket.recv(1024)
        if not data:
            break  # Разрываем соединение, если клиент отключился
        print(f"От {client_address}: {data.decode()}")  # Декодируем и печатаем
        client_socket.sendall(data)  # Эхо-ответ клиенту
    
    client_socket.close()

# Создаем TCP/IP сокет
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Задаем опции сокета
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# Биндим сокет на адрес и порт
server_host = 'localhost'
server_port = 12345
server_socket.bind((server_host, server_port))

# Переводим сокет в режим прослушивания
server_socket.listen(5)
print(f"Сервер запущен на {server_host}:{server_port}")

connections = []  # Массив для хранения данных о подключениях

try:
    while True:
        # Принимаем подключение
        client_socket, client_address = server_socket.accept()
        
        # Сохраняем данные подключения (хост и порт клиента)
        connections.append({'host': client_address[0], 'port': client_address[1]})
        
        # Создаем поток для обработки подключения
        client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
        client_thread.start()
finally:
    server_socket.close()

```

В данном примере мы создаем сервер, который слушает входящие соединения на порту `12345`. При подключении клиента мы запускаем для него отдельный поток, чтобы обработка его соединения не блокировала основной поток сервера, который продолжает слушать порт и принимать новые соединения.

Информация о подключениях сохраняется в списке `connections`, где каждый элемент - это словарь с хостом и портом клиента.

При обработке подключений важно корректно обрабатывать исключения и корректно закрывать соединения, чтобы сервер был устойчив к ошибкам клиентов.
Видимость переменных, 
но как только я решаю это проверить на сайте

Вангую, что экземпляр getClients на "сайте" не принадлежит экземпляру socket_create на сервере
Похожие вопросы