この記事では、PHP でソケットを実装する方法を主にテキストとコードの形式で説明します。お役に立てれば幸いです。
1. ソケットの概要
1. ソケットは単なるデータ構造です。
2. このソケット データ構造を使用して、クライアントとサーバー間のセッションを開始します。
3. サーバーは常にリッスンし、新しいセッションを生成する準備をしています。クライアントがサーバーに接続すると、サーバーがセッションを待機しているポートが開きます。
4. サーバーはクライアントの接続リクエストを受け入れ、ループを実行します。これで、クライアントはサーバーに情報を送信できるようになり、サーバーもクライアントに情報を送信できるようになります。
2. ソケット変数
ソケットを生成するには、プロトコル、ソケット タイプ、パブリック プロトコル タイプの 3 つの変数が必要です。
1. プロトコル
ソース コードを表示し、ヘルプを印刷するためにクリップボードにコピーします
AF_INET
//ソケットを生成し、送信に TCP または UDP を使用し、IPv4 で使用されるプロトコルアドレス
AF_INET6
//ソケットを生成し、送信に TCP または UDP を使用し、IPv6 アドレスで使用されるプロトコル
AF_UNIX
//ローカルプロトコル、 Unix および Linux システムで使用されますが、通常はクライアントとサーバーが同じマシン上にある場合に使用されることはほとんどありません
SOCK_STREAM
//このプロトコルは、シーケンシャルで信頼性の高い、データ統合されたバイト ストリーム ベースの接続です。これは最も一般的に使用されるソケットのタイプです。このソケットは送信に TCP を使用します。
SOCK_DGRAM
//このプロトコルは、コネクションレスの固定長の転送呼び出しです。このプロトコルは信頼性が低く、接続に UDP を使用します。
SOCK_SEQPACKET
//このプロトコルは、固定長のデータ パケットを送信して送信する 2 回線の信頼できる接続です。このパケットは、読み取られる前に完全に受け入れられる必要があります。
SOCK_RAW
//このソケット タイプは、ICMP パブリック プロトコルを使用して単一のネットワーク アクセスを提供します。 (ping とtraceroute はこのプロトコルを使用します)
1.socket_create
関数: ソケットデータ構造の生成と同等です戻り値: 成功した場合はソケットリソース、エラーの場合は FALSE
2.socket_bind
関数: ソケットを IP アドレスとポートにバインドする
使用法:ソケットバインド (リソースソケット、文字列アドレス [, int port) ] )
パラメータ: ソケット、ソケットリソース、アドレス、IP アドレス、ポート
3.socket_accept
関数: ソケット接続を受け入れます
使用法:socket_accept (リソースソケット)
パラメータ: ソケット、ソケットリソース
戻り値: 成功した場合は新しいソケットリソースを返し、エラーの場合は FALSE を返します。
4.関数: ソケット接続を開始します
使用法:socket_connect (リソース ソケット、文字列アドレス [, int port])
パラメーター: ソケット、ソケット リソース、アドレス、IP アドレス、ポート、ポート
戻り値: ブール値
関数:指定されたソケットからのすべての接続をリッスンします
使用法:socket_listen (resourceソケット[, int backlog])
パラメータ:socket、ソケットリソース;
戻り値:ブール
関数:指定された長さのデータを読み取ります
使用法: socket_read (リソースソケット、int の長さ [, int 型])
パラメータ: ソケット、ソケットリソース; 長さ、文字の長さ、タイプ、PHP_BINARY_READ |PHP_NORMAL_READ
戻り値: string
関数: ソケットキャッシュへのデータの書き込み
:socket_write (リソース ソケット、文字列バッファ [, int length])
パラメータ:ソケット、ソケット リソース;バッファ、文字数;長さ、文字長;
戻り値:ブール値
関数:この関数はデータを送信します。接続されたソケット
使用法:socket_send (リソースソケット、文字列 buf、int len、int フラグ)
パラメータ:ソケット、ソケットリソース;buf、文字;len、文字長;
戻り値:ブール値
関数:取得現在のソケットの最後のエラーコード
使用法:socket_last_error ([リソースソケット])
パラメータ:socket, ソケットリソース;
戻り値:int
関数:指定されたエラー番号の詳細なエラーを返す
使用法:socket_strerror (int errno )
パラメータ: errno、socket_last_error no;
戻り値: string
関数: ソケットリソースを閉じる
使用法:ソケット_クローズ ([リソースソケット])
パラメータ: ソケット、ソケットリソース;
戻り値: null
ソケットを開く方法を確認します
a. PHP.ini ファイルを編集し、extension=php_sockets.dll の以前のコメントを削除します:
b. 拡張ライブラリをロードするコード
a、初期化 データを送受信するためにソケットが開かれ、バッファが開かれます。
b. 接続を待ちます。接続が生成されると、サーバー側の画面に「ソケットが接続されました」と表示されます。
c. サーバーはバッファーを確認し、バッファーにデータがある場合は、接続されているコンピューターにデータを送信します。
その後、このデータに対する受け入れメッセージを送信し、メッセージを受け入れると、メッセージをデータに保存し、接続されているコンピューターにメッセージを通知し、最後に接続を閉じます。
d. 接続が閉じられた後、サーバーは次の接続の処理を開始します。
ソース コードを表示し、クリップボードにコピーしてヘルプを印刷します
// 获取协议 $commonProtocol = getprotobyname("tcp"); //产生一个socket $socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol); //把socket绑定在一个IP地址和端口上 socket_bind($socket, 'localhost', 1337); //监听由指定socket的所有连接 socket_listen($socket); //初始化buffer $buffer = "NO DATA"; while(true) { //接受一个Socket连接 $connection = socket_accept($socket); printf("Socket connected\r\n"); // 检测 buffer if($buffer != ""){ printf("Something is in the buffer...sending data...\r\n"); //写数据到socket缓存 socket_write($connection, $buffer . "\r\n"); printf("Wrote to socket\r\n"); }else { printf("No Data in the buffer\r\n"); } //读取指定长度的数据 while($data = socket_read($connection, 1024, PHP_NORMAL_READ)) { $buffer = $data; //写数据到socket缓存 socket_write($connection, "Information Received\r\n"); printf("Buffer: " . $buffer . "\r\n"); } //关闭一个socket资源 socket_close($connection); printf("Closed the socket\r\n\r\n"); }
b. これがこのループで初めて到着する最初の接続である場合、サーバーはクライアントに「NO DATA」を送り返します。これが発生した場合、クライアントは接続の最上位にあります。
c. クライアントはデータをサーバーに送信し、データはサーバーに送信され、クライアントは応答を待ちます。応答を受信すると、応答を画面に書き込みます。
// 创建 socket $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //链接 socket $connection = socket_connect($socket,'localhost', 1337); //读取指定长度的数据 while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)) { if($buffer == "NO DATA") { printf("NO DATA"); break; }else{ // 输出 buffer printf("Buffer Data: " . $buffer . ""); } } printf("Writing to Socket"); //写数据到socket缓存 if(!socket_write($socket, "SOME DATA\r\n")){ printf("Write failed"); } //读取指定长度的数据 while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)){ printf("Data sent was: SOME DATA Response was:" . $buffer . ""); } printf("Done Reading from Socket");
以上がPHPでソケットを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。