ホームページ >PHPフレームワーク >Swoole >swoole の WebSocket 接続を表示する

swoole の WebSocket 接続を表示する

coldplay.xixi
coldplay.xixi転載
2021-03-16 10:40:042820ブラウズ

swoole の WebSocket 接続を表示する

編集者も swoole は初めてで、公式ドキュメントには swoole のデモに関する情報がほとんどなく、明確に説明されていない箇所もあります。 WebSocket は 2 日後にようやく握手しました。成功しました。私の経験を書き留めてください。困っている人たちの助けになれば幸いです。

まず最初に、私の実行環境は外部ネットワークサーバー上に直接置かれていることを紹介します. プログラムの実行環境については詳しく説明しません. swooleの公式Webサイトを参照してください. 私はそこにアクセスしますIP を介して直接. その中で、編集者は落とし穴に遭遇しました。つまり、HTTP サーバーまたは WebSocket モニターに許可するポートがサーバー上で開かれている必要があります。編集者の Alibaba Cloud サーバーは、セキュリティ グループにアクセスして、ポートを解放し、受信方向と送信方向を設定する必要があります。そうしないと、ip: port

推奨 (無料): swoole

ここで次を紹介します。 2 WebSocket サーバーに接続する方法

1. http サーバーにアクセスしてから HTML ページにアクセスすることで WebSocket サーバーに接続するため、3 つのファイルが必要です。 1 http.php 2 ws.php 3 ws.html 私の写真を貼り付けるだけです。これも公式ドキュメントを参照して書かれています

http.php

<?php
/**
 * Created by PhpStorm.
 * User: xyj
 * Date: 18-9-9
 * Time: 下午4:31
 */

//实例化
$http_server = new swoole_http_server(&#39;0.0.0.0&#39;,9501);

//服务器配置
$http_server->set(
    [
        &#39;enable_static_handler&#39; => true,
        &#39;document_root&#39; => &#39;/www/wwwroot/test_project/swoole&#39;,
    ]
);

$http_server->on(&#39;request&#39;,function($request ,$response){
    //print_r($request->get);
    //设置响应头信息
    $response->cookie(&#39;xyj&#39;,&#39;hello&#39;,86400);
    //服务器返回信息
    $response->end(&#39;http_server&#39; . json_encode($request->get));
});

$http_server->start();

ws.php

<?php
/**
 * Created by PhpStorm.
 * User: xyj
 * Date: 18-9-9
 * Time: 下午5:02
 */

//创建websocket服务器对象,监听0.0.0.0:9502端口
$ws = new swoole_websocket_server("0.0.0.0", 9502);

$ws->set(
    [
        &#39;enable_static_handler&#39; => true,
        &#39;document_root&#39; => &#39;/www/wwwroot/test_project/swoole&#39;,
    ]
);
//监听WebSocket连接打开事件
$ws->on(&#39;open&#39;, function ($ws, $request) {
    var_dump($request->fd, $request->get, $request->server);
    $ws->push($request->fd, "hello, welcome\n");
});

//监听WebSocket消息事件
$ws->on(&#39;message&#39;, function ($ws, $frame) {
    echo "Message: {$frame->data}\n";
    $ws->push($frame->fd, "server: {$frame->data}");
});

//监听WebSocket连接关闭事件
$ws->on(&#39;close&#39;, function ($ws, $fd) {
    echo "client-{$fd} is closed\n";
});

$ws->start();

ws.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<h1>hello swoole 测试</h1>
</body>
</html>

<script>
    var wsServer = &#39;ws://:9502&#39;;
    var websocket = new WebSocket(wsServer);
    websocket.onopen = function (evt) {
        websocket.send(&#39;hello swoole!!!&#39;);
        console.log("Connected to WebSocket server.");
    };

    websocket.onclose = function (evt) {
        console.log("Disconnected");
    };

    websocket.onmessage = function (evt) {
        console.log(&#39;Retrieved data from server: &#39; + evt.data);
    };

    websocket.onerror = function (evt, e) {
        console.log(&#39;Error occured: &#39; + evt.data);
    };
</script>

ローカル テスト環境で実行している場合は、wsServer = 'ws://127.0.0.1:9502'。外部ネットワークの場合は、127.0.0.1 にする必要があります。アクセスしたアドレス、ここのポートは WebSocket サーバーのポートと一致している必要があります、そうでない場合はアクセスできません

準備が完了したので、WebSocket へのアクセスを開始します。まず、ターミナルで http.php と ws.php を実行します。通常の状況では、これが当てはまります。 エラーが発生した場合、一般的な問題はポートが占有されていることです。swoole 拡張機能がインストールされていない場合、または構文エラーがある場合は、公式ドキュメントを注意深く読んでください。

ポートが占有されている場合は、lsof -i:9501 コマンドを使用してポート情報を表示できます。強制終了する前に、そのポートが重要なポートであるかどうかを注意深く確認してください。むやみに強制終了しないでください。

もう 1 つの方法は、http.php を開いて、閉じた後に占有されている可能性のあるポートが時間内に解放されないことです。http.php を再度実行すると、ポートが占有されているというエラーがスローされます。ここでは、このコマンド netstat -ntlp を使用して、tcp リスニング ポートを表示できます。その親プロセスを強制終了してから実行すると、問題ありません。引き続きこのコマンドを使用して、次のように tcp ポートを表示します。

ここに来て、2 つのサーバーが起動しました。ブラウザからアクセスできます。ブラウザにアドレス「9501」を入力します。このとき、ここのポートはWebSocketポートではなく、httpサーバーのポートと同じである必要があります。アクセスが成功すると、次の図が表示されます。

これは、これらのメッセージを私が理解した方法です。間違いがある場合は、修正してください。現時点では、WebSocket ハンドシェイクは成功しています。

2 番目のアクセス タイプ、ws を開くだけです。 ブラウザ上で .php にアクセスする方法は 1 番目のタイプと同じですが、このときのポートが WebSocket ポートになり、表示されるページは 1 番目のタイプと同じです。

WebSocket のリンクに関して、編集者は大まかにこのような手順で進めていますが、もし間違っているところがあれば、ぜひ修正してください。

以上がswoole の WebSocket 接続を表示するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。