@AlexSer

Как настроить передачу данных между socket server и client?

Всем привет! Появилась задача настроить Socket Server на PHP для обмена данными с клиентами(не только на PHP, предположительно на C++).
Но так как я вообще до этого не имел дело с сокетами, то соответственно куча вопросов.
Что именно мне нужно:
Нужно чтобы сервер и клиент обменивались посредством определенных сигналов.
В зависимости, кому нужны данные идет определенный сигнал на обмен данными(протокол ASTM).
Т.е, если клиенту нужны данные от сервера, то клиент отправляет сигнал на обмен данными ENQ, а сервер собирает данные запроса по сигналу ACK, до сигнала заверщения EOT.
<i>Запрос </i>
Клиент -> ENQ,<code>https://qna.habr.com/#</code>
<i>Ответ</i>
Сервер ->ACK(до тех пор пока не пришел сигнал EOT), 
<i>Запрос </i>
<b>Клиент->EOT, </b>
Серевер(заверщение обмена данными)

Почему если fread() стоит раньше шем fwrite(), то консоль вообще ничего не показывает.
Пример:
<?php
    $ACK="ACK\n";
    $ENQ="ENQ\n";
    $EOT="EOT\n";
    $socket = stream_socket_server("tcp://127.0.0.1:8300", $errno, $errstr);
    if (!$socket) {
        echo "$errstr ($errno)<br />\n";
    } else {
        while ($connect = stream_socket_accept($socket,-1)) {
               $msg=fread($connect,1024);
               echo $msg;
            fclose($connect);
        }
        fclose($socket);
    }
?>


<?php

$ACK='ACK';
$ENQ='ENQ';
$EOT='EOT';
$socket_client= stream_socket_client("tcp://127.0.0.1:8300", $errno, $errstr, 30);
if (!$socket_client){
    echo "$errstr ($errno)<br />\n";
} else {
    $msg= fread($socket_client, 1024);
    fwrite($socket_client,$ENQ);
    echo $msg;
    fclose($socket_client);
}

А если fread поставить ниже fwite() то консоль выводит $msg.
  • Вопрос задан
  • 111 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Vitsliputsli
Почему если fread() стоит раньше шем fwrite(), то консоль вообще ничего не показывает. А если fread поставить ниже fwite() то консоль выводит $msg.

Вы запускаете сервер и он ждет подключения. Запускаете клиент он подключается к серверу. Затем сервер начинает слушать сокет $msg=fread($connect,1024). Если клиент после подключения сделает fwrite($socket_client,$ENQ), то отправит на сервер строку $ENQ, сервер примет ее, выведет на экран и закроет соединение. Если вместо fwrite напишите $msg= fread($socket_client, 1024), то клиент будет слушать сокет. В итоге, сервер и клиент оба слушают, оба ждут передачи, а так как никто из них ничего не шлет, то будут это делать до бесконечности.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽