Почему мой сервер не обновляет данные со второго клиента? - PullRequest
0 голосов
/ 05 апреля 2020

Обновление моего сервера отправило данные от второго клиента только тогда, когда первый клиент отправил собственные данные. Затем данные второго клиента будут показаны на сервере. До ответа первый клиент ничего от второго клиента не получил. Я думаю, второй клиент не удовлетворяет всем «если» или что-то в этом роде. Не могли бы вы дать мне несколько советов, пожалуйста?

сервер. php

<?php

ini_set('error_reporting', E_ALL ^ E_NOTICE);
ini_set('display_errors', 1);

set_time_limit(0);

ob_implicit_flush();

class Server
{
    public $socket;
    public array $clients;

    public function connect($address, $port)
    {
        $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socket\n" . socket_strerror(socket_last_error()) . "\n");
        socket_bind($this->socket, $address, $port) or die("Could not bind to socket\n" . socket_strerror(socket_last_error($this->socket)) . "\n");
        socket_listen($this->socket, 3) or die("Could not set up socket listener\n" . socket_strerror(socket_last_error($this->socket)) . "\n");
        socket_set_nonblock($this->socket);
    }

    public function receive()
    {
        while (true) {
            if (($newSocket = socket_accept($this->socket)) !== false) {
                if (is_resource($newSocket)) {
                    socket_write($newSocket, ">", 1).chr(0);
                    socket_set_nonblock($newSocket);
                    echo "New client connected\n";
                    $clients[] = $newSocket; 
                }
            }

            foreach ($clients as $k => $v) {
                $string = '';
                if ($char = socket_read($v, 1024, PHP_NORMAL_READ)) {
                    $string .= $char;
                }
                if ($string) {
                    $string .= "\n";
                    $output = "$k:$string";
                    echo $output;
                }
            }

        }
    }

    public function send()
    {
        while($this->receive() != null) {
            socket_write($this->socket, $this->receive(), strlen($this->receive())) or die("Could not send data to server\n" . socket_strerror(socket_last_error($this->socket)) . "\n");
        }
    }
}

$connect = new Server();
$connect->connect('localhost', 10000);
$connect->receive();
$connect->send();

клиент. php

<?php

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socket\n" . socket_strerror(socket_last_error()) . "\n");
socket_connect($socket, 'localhost', 10000) or die("Could not connect to server\n" . socket_strerror(socket_last_error($socket)) . "\n");

while (true) {
    $input = readline();
    $input .= "\n";
    socket_write($socket, $input, strlen($input)) or die("Could not send data to server\n" . socket_strerror(socket_last_error($socket)) . "\n");
    while(($read = socket_read($socket, 1024, PHP_NORMAL_READ)) !== false) {
        echo "Read: $read\n";
    }
    sleep(1);
}
...