ホームページ  >  記事  >  バックエンド開発  >  単純なPHPソケット通信を実装する方法

単純なPHPソケット通信を実装する方法

伊谢尔伦
伊谢尔伦オリジナル
2017-05-23 10:38:2923027ブラウズ

単純なPHPソケット通信を実装する方法

socket (一般に「ソケット」とも呼ばれる) は、IP アドレスとポートを記述するために使用され、通信チェーンへのハンドルです。アプリケーションは通常、「ソケット」を通じてネットワークにリクエストを送信するか、ネットワークリクエストに応答します。 ソケットはプログラムでもプロトコルでもありません。オペレーティング システムによって提供される通信層用の抽象的な API のセットにすぎません。前の章では、ソケット通信で使用される php ソケットの一般的で重要な機能をいくつか紹介しました。

通信にはサーバーとクライアントが必要です:

サーバー: phpを使用してソケットを初期化し、ポートをバインドしてポートを監視します。 accept を呼び出してブロックし、クライアントが接続するのを待ちます。

クライアント: クライアントはソケットを初期化し、接続が成功すると、クライアントとサーバー間の接続が確立されます。クライアントがデータ要求を送信し、サーバーが要求を受信して​​処理し、次に応答データをクライアントに送信し、クライアントがデータを読み取り、最後に接続を閉じて対話が終了します。

クライアントサーバーは、相互に対話できるアプリケーションです。クライアントとサーバー間の対話には接続が必要です。ソケット プログラミングは、アプリケーション間の対話型接続を確立する役割を果たします。

ソケット接続プロセス

接続の開始方法とローカルソケットの接続先に基づいて、ソケット間の接続プロセスは、サーバーリスニング、クライアントリクエスト、接続確認の 3 つのステップに分けることができます。

(1) サーバー監視: サーバー側ソケットは特定のクライアントソケットを見つけず、接続待ちの状態となり、ネットワークの状態をリアルタイムに監視します。

(2) クライアントリクエスト: クライアントのソケットによる接続リクエストを指し、接続対象はサーバーのソケットです。これを行うには、クライアントのソケットは、まず接続先のサーバーのソケットを記述し、サーバー側のソケットのアドレスとポート番号を指定して、サーバー側のソケットに接続要求を行う必要があります。

(3) 接続確認: サーバー側ソケットがクライアントソケットの接続要求をリッスンまたは受信すると、クライアントソケットの要求に応答し、新しいスレッドを確立し、サーバーに接続することを意味します。エンドソケットの説明がクライアントに送信され、クライアントがこの説明を確認すると、接続が確立されます。サーバー側ソケットは引き続き待機状態にあり、他のクライアント ソケットからの接続要求を受信し続けます。

ソケットの原理については、以下のフローチャートを参照してください:

単純なPHPソケット通信を実装する方法

以下は、サーバー/クライアント コード例

1 によるソケット通信プロセス全体の簡単な実装です。

<?php
set_time_limit(0); //限制执行时间  0为不限制
$ip = &#39;127.0.0.1&#39;;
$port = 8001;//端口
/**
socket通信整个过程 
socket_create  //创建一个套接字
socket_bind  //给套接字绑定 ip 和端口
socket_listen //监听套接字上的连接
socket_accept //接受一个socket连接
socket_read //接收客户端 发送的数据
socket_write //将数据写到 socket 缓存 向客户端发送
socket_close   //关闭套接字资源
*/ 
if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) {
    echo "socket_create() 失败的原因是:".socket_strerror($sock)."\n";
}
if(($ret = socket_bind($sock,$ip,$port)) < 0) {
    echo "socket_bind() 失败的原因是:".socket_strerror($ret)."\n";
}
if(($ret = socket_listen($sock,4)) < 0) {
    echo "socket_listen() 失败的原因是:".socket_strerror($ret)."\n";
}
$count = 0;
do {
    if (($msgsock = socket_accept($sock)) < 0) {
        echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
        break;
    } else {
        
        //发到客户端
        $msg ="测试成功!\n";
        socket_write($msgsock, $msg, strlen($msg));
        
        echo "测试成功了啊\n";
        $buf = socket_read($msgsock,8192);
        
        
        $talkback = "收到的信息:$buf\n";
        echo $talkback;
        
        if(++$count >= 5){
            break;
        };
        
    
    }
    //echo $buf;
    socket_close($msgsock);
} while (true);
socket_close($sock);
?>

php ファイルを実行します。

実行後、netstat -ntlp を使用して、ポート 8001 が占有されているかどうかを確認できます。下の写真を参照してください。

単純なPHPソケット通信を実装する方法

2. クライアントコード:

<?php
error_reporting(E_ALL);
set_time_limit(0);
echo "socket通信客户端\n";
$port = 8001;//端口
$ip = "127.0.0.1";//ip
/**
socket连接整个过程
 socket_create //建立一个socket 连接
 socket_connect // 开始一个socket连接  连接服务端
 socket_write //将数据写入缓存   向服务端发送
 socket_read// 读取服务端的结果
 socket_close // 关闭套接字资源
  */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
    echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";
}else {
    echo "OK.\n";
}
echo "试图连接 &#39;$ip&#39; 端口 &#39;$port&#39;...\n";
$result = socket_connect($socket, $ip, $port);
if ($result < 0) {
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
}else {
    echo "连接OK\n";
}
$in = "Ho\r\nfirst blood\r\n";
$out = &#39;&#39;;
if(!socket_write($socket, $in, strlen($in))) {
    echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n";
}else {
    echo "发送到服务器信息成功!\n";
    echo "发送的内容为:<font color=&#39;red&#39;>$in</font> <br>";
}
while($out = socket_read($socket, 8192)) {
    echo "接收服务器回传信息成功!\n";
    echo "接受的内容为:",$out;
}
echo "关闭SOCKET...\n";
socket_close($socket);
echo "关闭OK\n";
?>

サーバーウィンドウの結果を見る:

単純なPHPソケット通信を実装する方法

注: PHP 言語の特性により、php はこの点でのみクライアントに適しており、クライアントには適していません。サーバー。

【おすすめ関連チュートリアル】

1.「

php.cn Dugu Jiijian (4) - PHPビデオチュートリアル

2.

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。