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

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

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

Похожие вопросы