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

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

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

Войти через центр авторизации
Похожие вопросы