Форум программистов, компьютерный форум, киберфорум
PHP: сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 93

Использование сокетов для сервера с множеством клиентов

17.05.2016, 12:14. Показов 908. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Суть в том: есть веб-приложение (работает локально внутри заведения. Клиентов не больше 250, но, скорее всего, маловероятно, что одновременно их будет больше 10), через него, по сути, происходит чтение/запись информации в базу данных. Сейчас у меня просто обновляется страница каждые 30 секунд, но теперь нужно переделать под сокеты. Простые реализации с одним клиентом я нашел, для множественных, как я понял, нужно использовать socket_select, но я не понимаю, как с ним работать. Сама идея такова: в случае записи в БД серверу отправляется сообщение об этом, а он в ответ сообщает клиентам о том, что нужно перезагрузить страницу (ну или часть страницы, так как давно собирался начать изучения Ajax-а, а тут будет повод). Или это неправильный подход?

Никогда раньше не работал с сокетами, можете помочь статьями или примерами? Есть ли другие относительно простые (в том плане, чтобы не требовали полного переписывания имеющегося кода или серьезных настроек на сервере - я пока работаю локально через Denwer, а развертывать будет другой человек) реализации? Видел несколько уроков на nginx, но я с ним незнаком в принципе, и в уроках использовался JavaScript, не уверен, что там все нормально будет работать в IE8.

Заранее спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.05.2016, 12:14
Ответы с готовыми решениями:

Использование функции accept() для сервера на основе сокетов
Доброго времени суток, уважаемые форумчане. Сейчас на си++ пишу сервер-клиент на основе сокетов. Появилось несколько вопросов: 1....

Создание сокетов для 10 клиентов
Доброе утро , есть пример работы сокета. Он работает и это уже хорошо. Вопрос в следующем как создать 10 сокетов для 10 клиентов ? Где...

Сервер не отправляет сообщ для всех клиентов (ЧАТ с использ-ем сокетов)
В общем такая проблемка небольшая: Сервер не отправляет сообщ для всех клиентов (ЧАТ с использ-ем сокетов).На скрине отчетливо видно,что...

7
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 93
01.07.2016, 13:07  [ТС]
С этим частично разобрался. Может кто подсказать две вещи: пока тестирую на Апаче, в браузере образно говоря запускаю server.php и несколько client.php в которых бесконечный цикл по обмену сообщениями, но при закрытии в браузере страницы любого клиента соединение остается. Как можно отслеживать подобное событие и закрывать соединение?
Второй вопрос: даже если закрываю соединение клиента через socket_close() (и со стороны клиента, и со стороны сервера), то память не освобождается.
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
03.07.2016, 10:23
Цитата Сообщение от Адренс Аксидор Посмотреть сообщение
Как можно отслеживать подобное событие и закрывать соединение?
Если функция socket_read() или socket_write() вернули FALSE, то функцией socket_last_error() можно определить - по какой причине FALSE (клиент закрыл соединение, или еще что).
Цитата Сообщение от Адренс Аксидор Посмотреть сообщение
Второй вопрос: даже если закрываю соединение клиента через socket_close() (и со стороны клиента, и со стороны сервера), то память не освобождается.
Память чего? Сокета что ли? Да там 4 байта памяти на 1 сокет - это ни о чем. PHP лучше Вас знает когда и как эту память нужно освободить. Если уж так сильно надо, то можно принудительно запускать каждый раз gc_collect_cycles(), но не рекомендую.
1
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 93
05.07.2016, 14:50  [ТС]
Цитата Сообщение от pav1uxa Посмотреть сообщение
Память чего? Сокета что ли? Да там 4 байта памяти на 1 сокет - это ни о чем. PHP лучше Вас знает когда и как эту память нужно освободить. Если уж так сильно надо, то можно принудительно запускать каждый раз gc_collect_cycles(), но не рекомендую.
Спасибо, тут я частично разобрался - сам Апач тупит (ну или я, но сокеты точно не виноваты).
Цитата Сообщение от pav1uxa Посмотреть сообщение
Если функция socket_read() или socket_write() вернули FALSE, то функцией socket_last_error() можно определить - по какой причине FALSE (клиент закрыл соединение, или еще что).
В том то и дело, что они FALSE в этом случае не возвращают. Может дело в том, что я и сервер, и клиентов запускаю на одной машине, а при работе с разных компьютеров все будет нормально, но возможности это проверить у меня нет
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
05.07.2016, 16:37
Цитата Сообщение от Адренс Аксидор Посмотреть сообщение
В том то и дело, что они FALSE в этом случае не возвращают.
Не знаю, попробуйте установить тайм-аут. Пример работы тут http://php.net/manual/ru/funct... imeout.php
1
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 93
06.07.2016, 09:18  [ТС]
Цитата Сообщение от pav1uxa Посмотреть сообщение
Не знаю, попробуйте установить тайм-аут.
Поясню: клиенты не просто не отключаются, они еще и продолжают нормально общаться с сервером, т.е. тайм-аут не особо поможет. Ну и банальная перезагрузка страницы приводит к тому, что сервер начинает прослушивать нового клиента.
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
06.07.2016, 10:41
Цитата Сообщение от Адренс Аксидор Посмотреть сообщение
но при закрытии в браузере страницы любого клиента соединение остается. Как можно отслеживать подобное событие и закрывать соединение?
Цитата Сообщение от Адренс Аксидор Посмотреть сообщение
Поясню: клиенты не просто не отключаются, они еще и продолжают нормально общаться с сервером, т.е. тайм-аут не особо поможет.
Я не понимаю. Так они закрывают страницу или продолжают общаться.
1
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 93
06.07.2016, 12:58  [ТС]
Цитата Сообщение от pav1uxa Посмотреть сообщение
Я не понимаю. Так они закрывают страницу или продолжают общаться.
Когда пользователь закрывает/обновляет страницу браузера старое соединение остается и между клиентом (который как бы уже должен был отключиться) все равно идет с сервером обмен данными. Поясню, у меня в клиенте бесконечный цикл опроса сервера => при закрытии страницы браузера этот цикл продолжает работу, а должен прерваться.
Также прошу меня простить: я, написав и вчитавшись в предыдущее сообщение, начал понимать, что этот вопрос уже не имеет отношения к сетям - соединение со стороны сервера разорвется, когда я найду способ прерывать цикл при закрытии/обновлении страницы в браузере.

Добавлено через 46 минут
В общем, решил эту проблему через echo и connection_status(), просто я её искал не там, где надо было. Спасибо за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.07.2016, 12:58
Помогаю со студенческими работами здесь

Использование сокетов для загрузки исходного кода сайта
Здравствуйте, использую сокеты чтобы получить ответ от сервера, помогите найти ошибку: #include <stdlib.h> #include...

Клиент-сервер со множеством клиентов java
Добрый день. Писал программу клиент-сервер со множественным подключением клиентов, но столкнулся с проблемой: не могу с одного сервера...

Создание сервера для работы удаленных клиентов
Добрый день. Прошу помощи в консультации по моему проекту. Имею парк 10-15 ПК для серфинга в интернете, на которые заходят удаленные...

Сокет сервера для нескольких клиентов без потоков?
Нужно с помощью select() Помогите разобраться с кодом - в main. //Подключаем библиотеку WinSock WSADATA wsaData; int...

Сырые сокеты: написание промежуточного сервера, через которого подключены клиенты и сервера клиентов
Доброго времени суток! Мне нужно сделать промежуточный сервер через которого подключены клиенты и сервера клиентов. Промежуточный сервер...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru