Сокеты: Клиент на PHP
![Сокеты: Клиент на PHP](/images/articles/php-socket-client.jpg)
В предыдущей статье я рассказывал про как создать сервер на PHP. Мы с Вами с использованием сокетов создали сервер на PHP. А в этой статье мы с Вами напишем клиента на PHP, который будет отправлять запрос на сервер и получать от него ответ.
Привожу код клиента на PHP:
<?php
header('Content-Type: text/plain;'); //Мы будем выводить простой текст
set_time_limit(0); //Скрипт должен работать постоянно
ob_implicit_flush(); //Все echo должны сразу же выводиться
$address = 'localhost'; //Адрес работы сервера
$port = 1985; //Порт работы сервера (лучше какой-нибудь редкоиспользуемый)
if (($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
//AF_INET - семейство протоколов
//SOCK_STREAM - тип сокета
//SOL_TCP - протокол
echo "Ошибка создания сокета";
}
else {
echo "Сокет создан\n";
}
$result = socket_connect($socket, $address, $port);
if ($result === false) {
echo "Ошибка при подключении к сокету";
} else {
echo "Подключение к сокету прошло успешно\n";
}
$out = socket_read($socket, 1024); //Читаем сообщение от сервера
echo "Сообщение от сервера: $out.\n";
$msg = "15";
echo "Сообщение серверу: $msg\n";
socket_write($socket, $msg, strlen($msg)); //Отправляем серверу сообщение
$out = socket_read($socket, 1024); //Читаем сообщение от сервера
echo "Сообщение от сервера: $out.\n"; //Выводим сообщение от сервера
$msg = 'exit'; //Команда отключения
echo "Сообщение серверу: $msg\n";
socket_write($socket, $msg, strlen($msg));
echo "Соединение завершено\n";
//Останавливаем работу с сокетом
if (isset($socket)) {
socket_close($socket);
echo "Сокет успешно закрыт";
}
?>
Код хорошо прокомментирован, поэтому, думаю, что здесь всё предельно понятно. Алгоритм работы клиента тривиальный: создание сокета, подключение к серверу, отправка запросов, получение ответов, закрытие соединения. Мы с Вами отправили число 15. Если Вы читали предыдущую статью, то помните, что задача сервера это число возвести в квадрат и вернуть его. Поэтому если Вы запустите этот клиент, то увидите от сервера 225 (15*15). Потом мы подаём команду shutdown, которая останавливает сервер.
Теперь у Вас есть минимальный набор знаний по работе с сокетами, а вообще тема очень интересная, поэтому Вы можете изучить её более детально. Вы можете создавать очень сложные клиент-серверные приложения, к котором Вы всегда сможете подключиться и отправлять самые различные запросы, которые сервер будет обрабатывать.
-
-
Михаил Русаков
Комментарии (9):
Михаил,вы сами проверяли свой скрипт клиента относительно серверу? Вот нмпример строка $result = socket_connect($socket, $address, $port); как она должна подключаться если переменной $socket нет,а есть $sock. Или я ошибаюсь?=)
Ответить
Спасибо, подправил!
Ответить
Михаил,здравствуйте.Я никогда не имел дел с сокетом,с чего лучше начинать?Мне нужно чтобы скрипт вытаскивал инфу с игрового сервера и выводил в понятном мне формате.Что посоветуйте? вот пример. http://narod.ru/disk/61234356001.1422047c71b5cae33ed0f7a891da12b5/inv.php.html
Ответить
Для начала с примером в статье и разберитесь. Как именно реализовать это для игрового сервера, это уже другой вопрос.
Ответить
Добрый день! Я не совсем пойму. Ваш пример работает только кога "Сервер" и "клиент" запущен в браузере иначе выдает "Сокет создан <!--error--><br /> <b>Warning</b>: socket_connect() [<a href='function.socket-connect'>function.socket-connect</a>]: unable to connect [0]: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение. in <b>Z:\home\localhost\www\testim\test_soces\client.php</b> on line <b>16</b><br /> <script language=JavaScript src='/denwer/errors/phperror_js.php'></script>Ошибка при подключении к сокету<!--error--><br /> <b>Warning</b>: socket_read() [<a href='function.socket-read'>function.socket-read</a>]: unable to read from socket [0]: Запрос на отправку или получение данных (when sending on a datagram socket using a sendto call) no address was supplied. in <b>Z:\home\localhost\www\testim\test_soces\client.php</b> on line <b>22</b><br /> <script language=JavaScript src='/denwer/errors/phperror_js.php'></script>Сообщение от сервера: . Сообщение серверу: 29 <!--error--><br /> <b>Warning</b>: socket_write() [<a href='function.socket-write'>function.socket-write</a>]: unable to write to socket [0]: Запрос на отправку или получение данных (when sending on a datagram socket using a sendto call) no address was supplied. in <b>Z:\home\localhost\www\testim\test_soces\client.php</b> on line <b>26</b><br /> <script language=JavaScript src='/denwer/errors/phperror_js.php'></script><!--error--><br /> <b>Warning</b>: socket_read() [<a href='function.socket-read'>function.socket-read</a>]: unable to read from socket [0]: Запрос на отправку или получение данных (when sending on a datagram socket using a sendto call) no address was supplied. in <b>Z:\home\localhost\www\testim\test_soces\client.php</b> on line <b>27</b><br /> <script language=JavaScript src='/denwer/errors/phperror_js.php'></script>Сообщение от сервера: . Сообщение серверу: exit <!--error--><br /> <b>Warning</b>: socket_write() [<a href='function.socket-write'>function.socket-write</a>]: unable to write to socket [0]: Запрос на отправку или получение данных (when sending on a datagram socket using a sendto call) no address was supplied. in <b>Z:\home\localhost\www\testim\test_soces\client.php</b> on line <b>31</b><br /> <script language=JavaScript src='/denwer/errors/phperror_js.php'></script>Соединение завершено Сокет успешно закрыт" Вы немогли бы описать что не так или это так и должно быть! Если так и должно быть то совсем не понимаю зачем они нужны эти "Сокеты"
Ответить
Не подключается, возможно, сервер не сделали, чтобы было куда подключаться.
Ответить
Вроде все сделал правильно! Если в браузере отткрыт фаил "server.php" то все срабатывает нормально, но только один раз. Что можно сделать? Я вроде все установил как надо
Ответить
Михаил, Здравствуйте. Я сохранил код сервера и код клиента, затем открыл вкладку в браузере через которую запустил код сервера, а потом запустил код клиента и все работает замечательно, но почему-то всего лишь один раз, если запустить код клиента еще один раз, то лезут ошибки "socket_connect(): unable to connect [10061]: No connection could be made because the target machine actively refused it." Пробовал не закрывать соединение как на сервере так и на клиенте, код не работает, а точнее лезут опять же ошибки. Как запустить сервер так, чтобы я мог в любое время обращаться к нему? Если обращаться к серверу через HTML5 websocket нужно ли серверу отправлять заголовки о том, что он поддерживает сокеты? И в какой части кода они должны отправляться? Заранее очень благодарен за ответы!
Ответить
Уважаемый админ ответьте пожалуйста на два предыдущих комента почему нормально срабатывает только один раз. Спс.
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.