Я создаю приложение для простого чата в python, используя программирование сокетов, и мне нужно, чтобы мой сокет принимал неограниченное количество подключений, в отличие от этого «socket.listen (100)», которое ограничено 100. Пожалуйста, объясните мне, что я должен делать, чтобы обрабатывать большое количество соединений?Принимать неограниченные соединения с сокетом
ответ
Числа дано с listen()
является размером отставания очереди - это намека количеству ожидающих запросов, а не количество активных запросов.
Вы часто увидите значение 5
, используемое для backlog параметр - это исторический. Ранние версии сокетов Berkeley имели «функцию», где любое значение, большее 5, просто дало 5. Так было 5. Это было зафиксировано давно, но это еще не номер, о котором вам нужно слишком беспокоиться - помните, что это только намек.
Если отставание превышено, фактическая ошибка, выдаваемая клиенту, обычно является уловкой ECONNREFUSED
, но для более старых систем используется определенная ошибка с отставанием.
На многих системах отставание молча усечено до SOMAXCONN
.
Смотрите также listen() ignores the backlog argument?
Вы хотите иметь цикл accept(), который ничего не принимает, а принимает() новые соединения и запускает новый поток для обработки каждого из них. Всякий раз, когда кто-либо пытается подключиться, он мгновенно принимает их и добавляет их в список подключений.
Нить на соединение, которое читается с длинным таймаутом, независимо от того, что вы хотите, чтобы ваш тайм-аут ожидания сессии был. Если истечет время ожидания, вы закрываете сокет и выходите из потока.
Если на сервере не хватает FD, что произойдет, если будет достаточно одновременных соединений, accept() начнет сбой с соответствующей ошибкой: в этом случае вы просто проигнорируете его и продолжаете цикл. Возможно, вы уменьшите тайм-аут простоя в этой ситуации и вернете его, когда принимаете снова начать работу.
Вы плохо относитесь к проблеме. С сокетами на стороне сервера вы принимаете подключения к одному и тому же сокету, которые затем обрабатываются другими процессами/потоками.
#
# Setup socket and other handling stuff here
#
while True:
conn = sock.accept()
thread.start_new_thread(handler, (conn,))
Будет установлено практическое ограничение на максимальное количество сокетов на основе памяти вашей системы.
См. http://docs.python.org/2/library/socketserver.html. Я думаю, что последние несколько примеров (под Asynchronous Mixins) очень близки к тому, чего вы хотите достичь.
- 1. Неограниченные журналы с logrotate
- 2. Связь с сокетом TCP (сервер)
- 3. CodeIgniter - неограниченные параметры?
- 4. recv с неблокирующим сокетом
- 5. отправить файл с сокетом
- 6. recv с сырым сокетом
- 7. Android java.lang.ClassCastException с сокетом
- 8. Как заставить gdbserver принимать более одного соединения?
- 9. Проверьте, может ли сервер MySQL принимать соединения
- 10. Могут ли файлы данных data.table принимать соединения?
- 11. Принимать только соединения из моего приложения
- 12. Принимать соединения внутри одной локальной сети
- 13. PHP: постоянное соединение mysqli с сокетом mysql?
- 14. Принимать соединения только из определенной подсети
- 15. Установление соединения с Android
- 16. Взаимодействие Matlab с сетевым сокетом
- 17. Как подключить() с неблокирующим сокетом?
- 18. Общение с классическим сокетом TCP
- 19. многопоточный перенос файлов с сокетом
- 20. Сделать IPython Notebook принимать соединения только с заданного адреса/подсети
- 21. Почему сервер с прослушиванием (sockfd, 2) способен принимать 3 соединения?
- 22. Последующие Торцевые соединения с веб-страницы, принимать различные времена
- 23. Неограниченные иерархические маршруты
- 24. Разбор GSON Неограниченные объекты
- 25. Неограниченные Локальная ошибка Python
- 26. Неограниченные параметры типа литейные
- 27. Неограниченные ранец в Python
- 28. Codeignign Routing Неограниченные параметры
- 29. Неограниченные кванторов в комплексе
- 30. WordPress неограниченные боковые панели
У вас есть неограниченный трафик для ваших неограниченных соединений? –
Да, у меня есть VPS с неограниченной пропускной способностью. – Matarata
Параметр '' socket.listen' '- это максимальное количество ожидающих соединений, которые еще не были '' accept''. Он не ограничивает количество установленных соединений. – jasonharper