Сокеты: Сервер на PHP
В предыдущей статье я рассказывал про сокеты на PHP. И сказал, что необходимо написать сервер, принимающий запросы и отдающий ответы. И клиента, посылающего запросы к серверу. В этой статье мы разберём код для классического сервера, принимающего число, возводящий его в квадрат и возвращающий результат клиенту.
Сразу привожу код сервера на PHP с подробными комментариями:
<?php
header('Content-Type: text/plain;'); //Мы будем выводить простой текст
set_time_limit(0); //Скрипт должен работать постоянно
ob_implicit_flush(); //Все echo должны сразу же отправляться клиенту
$address = 'localhost'; //Адрес работы сервера
$port = 1985; //Порт работы сервера (лучше какой-нибудь редкоиспользуемый)
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
//AF_INET - семейство протоколов
//SOCK_STREAM - тип сокета
//SOL_TCP - протокол
echo "Ошибка создания сокета";
}
else {
echo "Сокет создан\n";
}
//Связываем дескриптор сокета с указанным адресом и портом
if (($ret = socket_bind($sock, $address, $port)) < 0) {
echo "Ошибка связи сокета с адресом и портом";
}
else {
echo "Сокет успешно связан с адресом и портом\n";
}
//Начинаем прослушивание сокета (максимум 5 одновременных соединений)
if (($ret = socket_listen($sock, 5)) < 0) {
echo "Ошибка при попытке прослушивания сокета";
}
else {
echo "Ждём подключение клиента\n";
}
do {
//Принимаем соединение с сокетом
if (($msgsock = socket_accept($sock)) < 0) {
echo "Ошибка при старте соединений с сокетом";
} else {
echo "Сокет готов к приёму сообщений\n";
}
$msg = "Hello!"; //Сообщение клиенту
echo "Сообщение от сервера: $msg";
socket_write($msgsock, $msg, strlen($msg)); //Запись в сокет
//Бесконечный цикл ожидания клиентов
do {
echo 'Сообщение от клиента: ';
if (false === ($buf = socket_read($msgsock, 1024))) {
echo "Ошибка при чтении сообщения от клиента";
}
else {
echo $buf."\n"; //Сообщение от клиента
}
//Если клиент передал exit, то отключаем соединение
if ($buf == 'exit') {
socket_close($msgsock);
break 2;
}
if (!is_numeric($buf)) echo "Сообщение от сервера: передано НЕ число\n";
else {
$buf = $buf * $buf;
echo "Сообщение от сервера: ($buf)\n";
}
socket_write($msgsock, $buf, strlen($buf));
} while (true);
} while (true);
//Останавливаем работу с сокетом
if (isset($sock)) {
socket_close($sock);
echo "Сокет успешно закрыт";
}
?>
Данный код я постарался тщательно прокомментировать, поэтому, надеюсь, Вам в нём всё понятно. Главное понять следующее: сервер - это непрерывно выполняющийся скрипт, который просто ждёт подключения клиентов. Затем принимающий запрос и на основании этого запроса, возвращающий клиенту ответ. Это самое главное, что Вам необходимо понять.
А в следующей статье мы с Вами напишем клиента на PHP, который и будет подключаться к данному серверу и отправлять различные запросы.
-
- Михаил Русаков
Комментарии (14):
У меня ошибка, пишет что функции socket_create нет.
Ответить
Надо включить эту библиотеку. Для этого в php.ini расскоментируйте строчку: extension=php_sockets.dll, затем перезапустите сервер.
Ответить
Надо включить эту библиотеку. Для этого в php.ini расскоментируйте строчку: extension=php_sockets.dll, затем перезапустите сервер. --- Вот я всё по инструкции сделал,а оно мне: <!--error--><br /> <b>Fatal error</b>: Call to undefined function socket_create() in <b>Z:\home\localhost\www\server.php</b> on line <b>7</b><br /> <script language=JavaScript src='/denwer/errors/phperror_js.php'></script>
Ответить
Дополнительные модули к Денверу установите (скачайте их с http://denwer.ru).
Ответить
А что нужно именно скачать,можна ссылку ))
Ответить
Дополнительные модули нужно скачать: http://www.denwer.ru/packages/php5.html
Ответить
Ваш совет помог мне включить поддержку сокетов на денвере,спасибо!
Ответить
После установки дополнительных модулей ошибка сохранилась.
Ответить
Все отлично, но вот есть вопрос: здесь если мы получили коннект клиента, то пока он не перестанет слать что либо серверу(здесь пока не пошлет exit), другие клиенты будут как бы в очереди и не будут обрабатываться. Есть варианты одновременной обработки нескольких клиентов?
Ответить
Скажите хоть. Надо ли запускать самостоятельно "server.php" или его просто надо разместить и он сам будет непрерывно работать! Опишите пожалуйста, Может из за денвера моего не х..на не работает!?
Ответить
Надо запускать и сам он непрерывно работать не будет.
Ответить
"Главное понять следующее: сервер - это непрерывно выполняющийся скрипт" Зачем тогда вообще эти сокеты нужны? Где они используются?
Ответить
А как он запускается?
Ответить
Скажите пожалуйста, а как его запускать. этот сокет сервер на Денвере?
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.