Автор оригинала: 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/”