PHPでソケット通信を実装できますか?

藏色散人
リリース: 2023-03-17 21:52:01
オリジナル
3575 人が閲覧しました

php ではソケット通信を実装できます 実装方法は、 1. クライアントで「socketsocket_create();」を作成し、サーバーへの接続要求「socket_connect();」 2. 「socketsocket_create()」を作成します" サーバー上で ;" そして IP とポート番号をバインドします "socket_bind();"; 3. クライアントのメッセージを読み取るか、または "socket_wirte();socket_read" を通じてクライアントにメッセージを書き込みます。

PHPでソケット通信を実装できますか?

このチュートリアルの動作環境: Windows 10 システム、PHP バージョン 8.1、DELL G3 コンピューター

php はソケット通信を実現できますか? ?

socket PHP: 詳細かつシンプルなソケット TCP 通信 PHP 実装

1 背景の紹介

目標: 使用したいと考えていますソケット このサーバーの機能は、複数のクライアントからの接続を受け入れ、相互通信を完了することです。たとえば、クライアント A とクライアント B が同時にサーバー S に接続されています。クライアント A はサーバー S にメッセージを送信します。サーバー S は A のメッセージを B に転送します。同様に、B のメッセージも S を介して A に転送できます。この により、クライアント A とクライアント B 間の相互通信が実現されます。
今回はクライアントとサーバー間の接続と通信のみを実装し、サーバーの転送機能は当面実装しません。

2 TCP の簡単な紹介

2.1 TCP の「スリーウェイ ハンドシェイク」

TCP の 3 ウェイ ハンドシェイクでは、次のことができます。サーバーとクライアントが正常に通信できることを確認します。スリーウェイ ハンドシェイク プロセス: このプロセスの説明については、以下のリンクをクリックして参照できます。
PHPでソケット通信を実装できますか?
参考: https://www.php.cn/link/70203474234c15a59de1eacc053f5690

#2.2 IP とポート

サーバーには次のものが必要です。 IP または TCP で通信する場合は、ポート番号も指定する必要があります。
カスタマー サービス側には IP が必要であり、TCP と通信する場合はポート番号も提供する必要があります。

個人的な理解: IP は住所であり、家に相当します。通信を確立する必要がある場合、まず家がどこにあるのかを知る必要があります。そうでない場合、どこに情報を送信すればよいでしょうか?
PORT ポート、ポート番号はこの家のドアとして理解できます。このドアでメッセージを送信したり、このドアからメッセージを受信したりするには、ドアを指定する必要があります。

#2.2 クライアントとサーバー間の簡単な通信プロセス

2.2.1 php
Client のいくつかの関連機能:

    ソケットの作成
  1. socket_create();
  2. サーバーからの接続のリクエスト
  3. socket_connect();
  4. メッセージの送信サーバーへ /サーバーメッセージを受け入れる
  5. socket_wirte(); /socket_read();
  6. ソケットを閉じる
  7. socket_close();
Server :

  • ソケットの作成

    socket_create();

  • IP とポート番号をバインド

    socket_bind();

  • リスニング IP とポート番号 (0.0.0.0 は任意の IP を意味します)

    socket_listen();

  • ブロッキング顧客サービスを待っています 接続の終了

    socket_accept();

  • クライアント メッセージの読み取り/クライアントへのメッセージの書き込み

    socket_wirte(); /socket_read();

  • ソケットを閉じる

    socket_close();

2.2.2 簡単な通信プロセス
    サーバーはソケットを作成し、IP とポートをバインドして、リスニング状態に入り、クライアントが接続を開始するのを待ちます。
  • #クライアントはソケットを作成し、指定されたサーバー IP およびポートに接続します。

  • サーバーは、クライアントによって開始された接続を受け入れます。

  • 双方が相互にデータを送信できます

  • 双方がソケットを閉じます。

#AB ##ソケットの作成ソケットを作成し、「アクセスを許可」を設定します。 IP とポート#特定の (またはすべての) IP と特定のポートをリッスンし、クライアントを待機するブロッキングに入ります#指定されたサーバー IP/ポートへの接続を開始します#クライアントからの接続を受け入れます A ##双方が接続を確立しましたメッセージを送信メッセージを送信##コミュニケーション終了後、A と B は次のことに同意します ソケットを閉じますA# #B

これは簡単な通信プロセスであり、周期送信や異常検出などの詳細です。

3 練習を始める

3.1 PHP のインストールと環境構成

  1. PHP をインストールする 。ここでは XAMPP を直接インストールしましたが、このソフトウェアが自動的に PHP をインストールしました。 PHP 言語を初めて使用する場合は、Baidu から PHP を直接インストールすることも、XAMPP をインストールすることもできます。
  2. システム環境構成。プログラムを実行するときは cmd を通じて実行するため、システム環境変数を構成する必要があります。設定プロセスについては、リンク: PHP 環境変数の設定を参照してください。
  3. phpコマンドが実行できるかどうかを確認してください。手順 1 と 2 が完了したら、cmd を実行してコマンド php -v を実行すると、操作が完了すると PHP のバージョン番号が表示されます。 PHPでソケット通信を実装できますか?

#3.2 クライアント プログラム

##3.2.1 プログラムを作成する
新しいプログラムを作成するフォルダー
    socket
  1. 、このフォルダーの下に新しいテキスト ドキュメントを作成し、名前を client.php 注: 私のフォルダーはデスクトップ に作成されますOpen
  2. client.php
  3. 注: 普段 php エディタを持っていない場合は、この時点でメモ帳を使用して client.php を直接開くことができますwrite
  4. program
  5. 注: ここでプログラムを直接示してコメントします。2.2 のコミュニケーション プロセスに基づいて理解できます。ご質問がある場合は、メッセージを残してください。 #
    <?php
    $PORT = 请输入端口号; //端口号请查看博文:*3.2.2 程序执行*。设置有效端口:
    $client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建socket/参数1:代表IPV4/参数2:流传输/参数3:TCP/
    $result = socket_connect($client, "122.114.122.174", $PORT); //向指定地址/端口发出连接请求,连接结果返回到resule
    if($result == false){  //这里我们简单的对连接结果进行响应/为了Debug方便
        echo "ERROR CONNECT\n"; 
        die();
    } else {
        echo "CONNECTED\n";
    }
    $data = "Hello World\n"; //建立将要发送的消息
    socket_write($client, $data); //将消息发送出去
    socket_close($client); //关闭socket
    ?>
    ログイン後にコピー
  6. プログラムを作成した後、直接コピーすることも、
直接ダウンロードすることもできます
  1. 注: プログラムを直接実行すると、エラーが報告されます。ポート番号を指定する必要があります。プログラムの実行方法に関する次のセクションに進んでください。
3.2.2 プログラムの実行
プログラム
    を取得します。前のセクションで、簡単なカスタマー サービス プログラムがすでに完成しました。
  1. をクリックしてダウンロードしてください。 有効なポートを見つけます
  2. 。現在サーバーがないため、デバッグには他の人から提供されたサーバー アドレスとポートを使用する必要があります。
  3. 操作手順:
    1.ここをクリックして Web ページを開きます
    2.ページの下部にある 122.114.122.174:xxxxx を見つけます。
    3. xxxxx の部分をプログラムの 2 行目に置き換えて保存します。 Web ページの操作:

    プログラムの操作:
    PHPでソケット通信を実装できますか?

    PHPでソケット通信を実装できますか?cmd
  4. を開きます。 PHP 環境変数が設定されていない場合は、次を参照してください。
  5. 3.1 PHP のインストールと環境設定 コマンド
  6. cddesktop/socket を実行します。その目的は、ソケット フォルダーに移動し、独自のフォルダーの場所に応じて関連するパスを入力することです。 クライアント プログラム
  7. php client.php を実行します。この時点で PHP 致命的エラーが報告された場合は、クリックして解決策を表示してください。 最後に、情報が Web ページに受信されたことがわかります。
    注: プログラムの実行後、CONNECTED が出力されない場合は、しばらく待ってから ERROR CONNET が返されることを確認してください。これは、PHPでソケット通信を実装できますか? ポート番号の有効期限が切れているためです (3 分間のみ使用可能)。Web ページに戻って更新し、
    を変更してください。
    正しく実行できない場合は、メッセージを残してください!
3.3 ローカル サーバーおよびクライアント プログラム

自分で入力したくない場合は、

ここをクリックしてダウンロード

し、「3.3.3 プログラムの実行」に移動してください。

3.3.1 写程序/服务器
  1. 新建一个文件夹socket(如有,请忽略),在该文件夹下新建文本文档并改名为server.php NOTE:我的文件夹建在桌面上
  2. 打开server.php NOTE:如果你平时没有php的编辑器,这个时候可以直接用记事本打开server.php
  3. 写入程序 NOTE:程序我这里直接给出,并给予注释,大家可以结合2.2通信过程进行理解,如有疑问请留言
<?php
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建socket/参数解释同客服端
socket_bind($server, "0.0.0.0", 12345); //绑定端口和IP/0.0.0.0表示允许任意地址发起连接/12345表示允许12345端口号进行连接
socket_listen($server); //进入监听
$connection = socket_accept($server); //接受请求并建立连接
$data = socket_read($connection, 1024); //接受数据
echo $data; //打印数据
socket_close($server);//关闭socket
?>
ログイン後にコピー
3.3.2 写程序/客户端
  1. 打开文件夹socket(server.php所在文件夹),在该文件夹下新建文本文档并改名为client.php(如有,请打开直接修改程序即可) NOTE:我的文件夹建在桌面上
  2. 打开client.php NOTE:如果你平时没有php的编辑器,这个时候可以直接用记事本打开client.php
  3. 写入程序 NOTE:程序我这里直接给出,并给予注释,大家可以结合2.2通信过程进行理解,如有疑问请留言
<?php
$PORT = 12345; //与server端口匹配
$client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建socket/参数1:代表IPV4/参数2:流传输/参数3:TCP/
$result = socket_connect($client, "127.0.0.1", $PORT); //向指定地址/端口发出连接请求,连接结果返回到resule/127.0.0.1指本地IP
if($result == false){  //这里我们简单的对连接结果进行响应/为了Debug方便
    echo "ERROR CONNECT\n"; 
    die();
} else {
    echo "CONNECTED\n";
}
$data = "Hello World\n"; //建立将要发送的消息
socket_write($client, $data); //将消息发送出去
socket_close($client); //关闭socket
?>
ログイン後にコピー
3.3.3 程序执行
  1. 获取程序。通过上节,我们已经有一个本地客服端程序和一个服务器程序,下载请点击
  2. 打开cmd。如果没有配置PHP的环境变量请查看:3.1
  3. 执行命令cd desktop/socket。注意:这个路径需要根据自己实际情况填写,直接下载的应该是cd desktop/simple-socket-php/local-client-server主要目的是为了找到server.php所在的文件夹,根据自己文件夹位置填写相应路径。
  4. 执行服务器程序php server.php。我们发现cmd卡住了,这个时候在等待客户端连接进来。这个时候如果报错PHP Fatal error,请查看点击查看解决方法(如果想强制退出进程按下Ctrl+C
    PHPでソケット通信を実装できますか?
  5. 再打开一个cmd
  6. 执行命令cd desktop/socket。注意:这个路径需要根据自己实际情况填写,直接下载的应该是cd desktop/simple-socket-php/local-client-server主要目的是为了找到client.php所在的文件夹,根据自己文件夹位置填写相应路径。
  7. 执行客户端程序php client.php。(如果想强制退出进程按下Ctrl+C
    PHPでソケット通信を実装できますか?
    如果服务器没有反应,请按下Ctrl+C结束进程,重新按照顺序(先在一个CMD执行server.php,再在另一个CMD执行client.php)执行程序。如有疑问,请留言。

4 结束

到这里,我们已经实现了基本的socket通信,当然,这个程序是完全不能实际应用的,如果想要实际应用,需要增加很多细节方面的东西,有一个做的比较好的Workerman,大家可以自行搜索。
之后我会更新如何把这个server.php在自己的阿里云服务器上面运行,这样,我们就可以随时连接进去实现客服端的相互通信了。如果有兴趣可以关注等待。

推荐学习:《PHP视频教程

以上がPHPでソケット通信を実装できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート