Рубрики
Uncategorized

Сервис Websocket, механизм сетевой коммуникации для обучения swool (5)

Автор оригинала: David Wong.

I. Общий обзор websocket

Протокол Websocket Это новый сетевой протокол, основанный на TCP. Он реализует полнодуплексную связь между браузером и сервером- Разрешить серверу активно отправлять информацию клиенту

Почему именно websocket? Дефект: HTTP-связь может быть инициирована только клиентом

Особенности websocket:

  • Построен на протоколе TCP
  • Низкая стоимость производительности, высокая эффективность связи
  • Клиент может взаимодействовать с любым сервером
  • Идентификатор протокола WS WSS
  • Постоянный сетевой протокол связи

II. Реализация кода

Сервер Websocket

ws_server. php

swoole_websocket_server("0.0.0.0", 80);

//Listen for websocket connection open events
$ws->on('open', function ($ws, $request) {
    var_dump($request->fd, $request->get, $request->server);
    $ws->push($request->fd, "hello, welcome\n");
});

//Listen to websocket message events
$ws->on('message', function ($ws, $frame) {
    echo "Message: {$frame->data}\n";
    $ws->push($frame->fd, "server: {$frame->data}");
});

//Listen for websocket connection closing events
$ws->on('close', function ($ws, $fd) {
    echo "client-{$fd} is closed\n";
});

$ws->start();

Поскольку мы находимся в контейнере docker, мы используем порт 80, чтобы мы могли сопоставить порт до прохождения хост-компьютера и получить доступ к службе в браузере хоста.

Просмотр порта, сопоставленного с контейнером хоста:

➜  ~ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                        NAMES
5ee6bfcc1310        7698f               "/bin/bash"         46 hours ago        Up 30 hours         0.0.0.0:2221->22/tcp, 0.0.0.0:8880->80/tcp   confident_jones

Статическая страница клиента

Статический путь к странице/работа/учеба/код/свул/демо/статический

Статический путь к странице/работа/учеба/код/свул/демо/статический





    
    WebSocket TEST


Swoole-TEST

Доступ к браузеру хоста:

3. Оптимизация сервиса Websocket

Как мы видим, верхний ws_server.php Код-это код, ориентированный на процесс, который недостаточно элегантен. Здесь мы можем инкапсулировать эти методы и оптимизировать их с помощью объектно-ориентированных идей.

Здесь мы можем инкапсулировать эти методы и оптимизировать их с помощью объектно-ориентированных идей.

ws = new swoole_websocket_server(static::HOST, static::PORT);

        $this->ws->on("open", [$this, "onOpen"]);
        $this->ws->on("message", [$this, "onMessage"]);
        $this->ws->on("close", [$this, "onClose"]);

        $this->ws->start();
    }

    /**
     *Listen for WS connection events
     * @param $ws
     * @param $request
     */
    public function onOpen($ws, $request)
    {
        var_dump($request->fd);
    }

    /**
     *Listen for WS connection messages
     * @param $ws
     * @param $frame
     */
    public function onMessage($ws, $frame)
    {
        echo "ser-push-message:{$frame->data}\n";

        $ws->push($frame->fd, "server-push:".date("Y-m-d H:i:s"));

    }

    /**
     *Listen for websocket connection closing events
     *
     * @param $ws
     * @param $fd
     */
    public function onClose($ws, $fd)
    {
        echo "clientid:{$fd} closed \n";
    }
}

$ws_obj = new Ws();

Благодаря объектно-ориентированной инкапсуляции приведенный выше код выглядит элегантно~

Оригинал: “https://developpaper.com/websocket-service-a-network-communication-engine-for-swoole-learning-5/”