Php connect to socket client

# Sockets

The second line fails gracefully if connection failed.

socket_connect($socket, "chat.stackoverflow.com", 6667) or onSocketFailure("Failed to connect to chat.stackoverflow.com:6667", $socket); 

# Sending data to the server

The socket_write function sends bytes through a socket. In PHP, a byte array is represented by a string, which is normally encoding-insensitive.

socket_write($socket, "NICK Alice\r\nUSER alice 0 * :Alice\r\n"); 

# Receiving data from the server

The following snippet receives some data from the server using the socket_read function.

Passing PHP_NORMAL_READ as the third parameter reads until a \r / \n byte, and this byte is included in the return value.

Passing PHP_BINARY_READ , on the contrary, reads the required amount of data from the stream.

If socket_set_nonblock was called in prior, and PHP_BINARY_READ is used, socket_read will return false immediately. Otherwise, the method blocks until enough data (to reach the length in the second parameter, or to reach a line ending) are received, or the socket is closed.

This example reads data from a supposedly IRC server.

while(true)  // read a line from the socket $line = socket_read($socket, 1024, PHP_NORMAL_READ); if(substr($line, -1) === "\r")  // read/skip one byte from the socket // we assume that the next byte in the stream must be a \n. // this is actually bad in practice; the script is vulnerable to unexpected values socket_read($socket, 1, PHP_BINARY_READ); > $message = parseLine($line); if($message->type === "QUIT") break; > 

# Closing the socket

Closing the socket frees the socket and its associated resources.

# TCP server socket

# Socket creation

Create a socket that uses the TCP. It is the same as creating a client socket.

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 

# Socket binding

Bind connections from a given network (parameter 2) for a specific port (parameter 3) to the socket.

The second parameter is usually «0.0.0.0» , which accepts connection from all networks. It can also

One common cause of errors from socket_bind is that the address specified is already bound to another process

(opens new window) . Other processes are usually killed (usually manually to prevent accidentally killing critical processes) so that the sockets would be freed.

socket_bind($socket, "0.0.0.0", 6667) or onSocketFailure("Failed to bind to 0.0.0.0:6667"); 

# Set a socket to listening

Make the socket listen to incoming connections using socket_listen . The second parameter is the maximum number of connections to allow queuing before they are accepted.

# Handling connection

A TCP server is actually a server that handles child connections. socket_accept creates a new child connection.

$conn = socket_accept($socket); 

Data transferring for a connection from socket_accept is the same as that for a TCP client socket

When this connection should be closed, call socket_close($conn); directly. This will not affect the original TCP server socket.

# Closing the server

On the other hand, socket_close($socket); should be called when the server is no longer used. This will free the TCP address as well, allowing other processes to bind to the address.

# UDP server socket

A UDP (user datagram protocol) server, unlike TCP, is not stream-based. It is packet-based, i.e. a client sends data in units called «packets» to the server, and the client identifies clients by their address. There is no builtin function that relates different packets sent from the same client (unlike TCP, where data from the same client are handled by a specific resource created by socket_accept ). It can be thought as a new TCP connection is accepted and closed every time a UDP packet arrives.

# Creating a UDP server socket

$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); 

# Binding a socket to an address

The parameters are same as that for a TCP server.

socket_bind($socket, "0.0.0.0", 9000) or onSocketFailure("Failed to bind to 0.0.0.0:9000", $socket); 

# Sending a packet

This line sends $data in a UDP packet to $address : $port .

socket_sendto($socket, $data, strlen($data), 0, $address, $port); 

# Receiving a packet

The following snippet attempts to manage UDP packets in a client-indexed manner.

$clients = []; while (true) socket_recvfrom($socket, $buffer, 32768, 0, $ip, $port) === true or onSocketFailure("Failed to receive packet", $socket); $address = "$ip:$port"; if (!isset($clients[$address])) $clients[$address] = new Client(); $clients[$address]->handlePacket($buffer); > 

# Closing the server

socket_close can be used on the UDP server socket resource. This will free the UDP address, allowing other processes to bind to this address.

# Handling socket errors

socket_last_error can be used to get the error ID of the last error from the sockets extension.

socket_strerror can be used to convert the ID to human-readable strings.

function onSocketFailure(string $message, $socket = null)  if(is_resource($socket))  $message .= ": " . socket_strerror(socket_last_error($socket)); > die($message); > 

Источник

Сокеты: Клиент на PHP

Сокеты: Клиент на 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, которая останавливает сервер.

Теперь у Вас есть минимальный набор знаний по работе с сокетами, а вообще тема очень интересная, поэтому Вы можете изучить её более детально. Вы можете создавать очень сложные клиент-серверные приложения, к котором Вы всегда сможете подключиться и отправлять самые различные запросы, которые сервер будет обрабатывать.

Создано 18.01.2012 13:45:13

  • Михаил Русаков
  • Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

    Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
    Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

    Если Вы не хотите пропустить новые материалы на сайте,
    то Вы можете подписаться на обновления: Подписаться на обновления

    Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

    Порекомендуйте эту статью друзьям:

    Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

    1. Кнопка:
      Она выглядит вот так:
    2. Текстовая ссылка:
      Она выглядит вот так: Как создать свой сайт
    3. BB-код ссылки для форумов (например, можете поставить её в подписи):

    Комментарии ( 9 ):

    Михаил,вы сами проверяли свой скрипт клиента относительно серверу? Вот нмпример строка $result = socket_connect($socket, $address, $port); как она должна подключаться если переменной $socket нет,а есть $sock. Или я ошибаюсь?=)

    Михаил,здравствуйте.Я никогда не имел дел с сокетом,с чего лучше начинать?Мне нужно чтобы скрипт вытаскивал инфу с игрового сервера и выводил в понятном мне формате.Что посоветуйте? вот пример. http://narod.ru/disk/61234356001.1422047c71b5cae33ed0f7a891da12b5/inv.php.html

    Для начала с примером в статье и разберитесь. Как именно реализовать это для игрового сервера, это уже другой вопрос.

    Добрый день! Я не совсем пойму. Ваш пример работает только кога «Сервер» и «клиент» запущен в браузере иначе выдает «Сокет создан
    Warning: socket_connect() [function.socket-connect]: unable to connect [0]: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение. in Z:\home\localhost\www\testim\test_soces\client.php on line 16
    Ошибка при подключении к сокету
    Warning: socket_read() [function.socket-read]: unable to read from socket [0]: Запрос на отправку или получение данных (when sending on a datagram socket using a sendto call) no address was supplied. in Z:\home\localhost\www\testim\test_soces\client.php on line 22
    Сообщение от сервера: . Сообщение серверу: 29
    Warning: socket_write() [function.socket-write]: unable to write to socket [0]: Запрос на отправку или получение данных (when sending on a datagram socket using a sendto call) no address was supplied. in Z:\home\localhost\www\testim\test_soces\client.php on line 26

    Warning: socket_read() [function.socket-read]: unable to read from socket [0]: Запрос на отправку или получение данных (when sending on a datagram socket using a sendto call) no address was supplied. in Z:\home\localhost\www\testim\test_soces\client.php on line 27
    Сообщение от сервера: . Сообщение серверу: exit
    Warning: socket_write() [function.socket-write]: unable to write to socket [0]: Запрос на отправку или получение данных (when sending on a datagram socket using a sendto call) no address was supplied. in Z:\home\localhost\www\testim\test_soces\client.php on line 31
    Соединение завершено Сокет успешно закрыт» Вы немогли бы описать что не так или это так и должно быть! Если так и должно быть то совсем не понимаю зачем они нужны эти «Сокеты»

    Не подключается, возможно, сервер не сделали, чтобы было куда подключаться.

    Вроде все сделал правильно! Если в браузере отткрыт фаил «server.php» то все срабатывает нормально, но только один раз. Что можно сделать? Я вроде все установил как надо

    Михаил, Здравствуйте. Я сохранил код сервера и код клиента, затем открыл вкладку в браузере через которую запустил код сервера, а потом запустил код клиента и все работает замечательно, но почему-то всего лишь один раз, если запустить код клиента еще один раз, то лезут ошибки «socket_connect(): unable to connect [10061]: No connection could be made because the target machine actively refused it.» Пробовал не закрывать соединение как на сервере так и на клиенте, код не работает, а точнее лезут опять же ошибки. Как запустить сервер так, чтобы я мог в любое время обращаться к нему? Если обращаться к серверу через HTML5 websocket нужно ли серверу отправлять заголовки о том, что он поддерживает сокеты? И в какой части кода они должны отправляться? Заранее очень благодарен за ответы!

    Уважаемый админ ответьте пожалуйста на два предыдущих комента почему нормально срабатывает только один раз. Спс.

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.

    Источник

    Читайте также:  Блочные элементы
    Оцените статью