ホームページ > php教程 > PHP开发 > ソケット通信機構のサンプルをphpで詳しく解説

ソケット通信機構のサンプルをphpで詳しく解説

高洛峰
リリース: 2016-12-22 09:51:15
オリジナル
1103 人が閲覧しました

この記事の例では、php でのソケット通信メカニズムと使用法について説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです:

1. ソケットとは何ですか?

いわゆるソケットは通常「ソケット」とも呼ばれ、IP アドレスとポートを表すために使用されます。通信チェーンのハンドル。通常、アプリケーションは「ソケット」を通じてネットワークにリクエストを送信するか、ネットワークリクエストに応答します。端的に言えば、それはコミュニケーションのメカニズムです。これは、銀行、通信部門、その他の部門の電話顧客サービス部門に似ています。あなたが電話をかけると、顧客サービス部門はソケットのサーバー側に相当し、誰かが電話をかけている場合は、あなたの側はクライアントに相当します。もちろん、顧客サービス部門の電話交換機が重複することはありません。

ソケットがどのように機能するかを説明するために、以下に例を示します。アプリケーション層をベースに開発する場合、必ずしも原理を理解する必要はありませんが、知っていたほうが良いでしょう。インターネット上にはソケットに関する php API があります。置くだけで使えます。

2. ソケットサーバーserver.php

<?php  
// 建立server端socket  
$tcp = getprotobyname("tcp");  
$socket = socket_create(af_inet, sock_stream, $tcp);  
socket_bind($socket, &#39;127.0.0.1&#39;, 10008);       //绑定要监听的端口  
socket_listen($socket);       //监听端口 
 
//初始化一个数据,和客户端通信  
$buffer = "connect";  
while (true) {  
    // 接受一个socket连接  
    $connection = socket_accept($socket);  
    if(!$connection){  
        echo "connect fail";  
    }else{  
            echo  "socket connected ";  
            // 向客户端传递一个信息数据  
            if ($buffer != "") {  
                echo "send data to client ";  
                socket_write($connection, $buffer . " ");  
                echo  "wrote to socket ";  
            } else {  
                echo  "no data in the buffer " ;  
            }  
            // 从客户端取得信息  
            while ($data = @socket_read($connection, 1024, php_normal_read)) {  
                    printf("buffer: " . $data . " ");  
                    //取得信息给客户端一个反馈  
                    socket_write($connection, "information received ");  
            }
    } 
 
    socket_close($connection);  
    //关闭 socket  
    printf("closed the socket ");  
}  
?>
ログイン後にコピー

3. ソケットクライアントclient.php

<?php  
// 建立客户端的socet连接  
$socket = socket_create(af_inet, sock_stream, sol_tcp);  
$connection = socket_connect($socket, &#39;127.0.0.1&#39;, 10008);    //连接服务器端socket 
 
while ($buffer = @socket_read($socket, 1024, php_normal_read)) {  
    //服务端告诉客户端,自己的状态  
    if (preg_match("/not connect/",$buffer)) {  
        echo "don`t connect ";  
        break;  
    } else {  
        //服务器传来信息  
        echo "buffer data: " . $buffer . " "; 
 
        echo "writing to socket ";  
        // 将客户的信息写到通道中,传给服务器端  
        if (!socket_write($socket, "some data ")) {  
            echo "write failed ";  
        }  
        //服务器端收到信息后,给于的回应信息  
        while ($buffer = socket_read($socket, 1024, php_normal_read)) {  
                echo "sent to server: some data response from server was:" . $buffer . " ";  
        } 
 
    }  
} 
?>
ログイン後にコピー

4. 通信メカニズムの図(待ち時間に関係なくソケットを自動的に閉じる)

説明する前に簡単な説明サーバーとクライアントを実行するために php コマンドを使用する必要がある理由について説明します。クライアントで fsockopen を使用すると、接続がタイムアウトします。これはなぜでしょうか? ソケットを作成すると、クライアントが接続を希望しているかどうかが常に監視されるからです。

ソケット通信の確立には、サーバーによって作成されるものとクライアントによって作成されるものの 2 つのソケット チャネルが必要です。

行 1、サーバーはソケット チャネルを作成し、情報をキャッシュに置き、クライアントの接続を待ちます

行 2、クライアントはソケット チャネルを作成し、サーバーに接続してサーバー側の情報を取得します送信される通信 情報はチャネル

3 行目に送信されます。サーバーはクライアントから情報を取得し、クライアントに情報を受信したことを伝えます。送信したい情報をチャネル

4行目に送信し、クライアントはサーバーから確認情報を取得します

この時点で通信は完全に確立されており、データ送信が完了するとサーバーはソケット通信を切断します。具体的な操作は以下の通りです

1 ソケットサーバーを実行します

[root@blackghost zhangy]# /usr/local/php/bin/php -a /home/zhangy/www/test2/server.php 
interactive mode enabled
ログイン後にコピー

これはどのような作業を行っていますか

a 10008ポートをリッスンします

[zhangy@blackghost ~]$ netstat -an |grep listen |grep 10008
tcp        0      0 127.0.0.1:10008    0.0.0.0:*      listen
[zhangy@blackghost ~]$
ログイン後にコピー

b キャッシュに情報を送信します

$buffer = "connect";
ログイン後にコピー

コードを見てください上記

2 ソケットクライアントを実行します

[root@blackghost zhangy]# /usr/local/php/bin/php -a /home/zhangy/www/test2/client.php 
interactive mode enabled 
 
buffer data: connect 
 
writing to socket 
sent to server: some data 
response from server was:information received
ログイン後にコピー

3 サーバーサイドに戻ります

[root@blackghost zhangy]# /usr/local/php/bin/php -a /home/zhangy/www/test2/server.php 
interactive mode enabled 
 
socket connected 
send data to client 
wrote to socket 
buffer: some data 
 
closed the socket
ログイン後にコピー

この記事が皆様の PHP プログラミング設計に役立つことを願っています。

PHP のソケット通信メカニズムの例と関連記事の詳細な説明については、PHP 中国語 Web サイトに注目してください。


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