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

PHPでソケットを実装する方法

小云云
小云云オリジナル
2018-03-31 14:09:525132ブラウズ

この記事では、PHP でソケットを実装する方法を主にテキストとコードの形式で説明します。お役に立てれば幸いです。

1. ソケットの概要
1. ソケットは単なるデータ構造です。
2. このソケット データ構造を使用して、クライアントとサーバー間のセッションを開始します。
3. サーバーは常にリッスンし、新しいセッションを生成する準備をしています。クライアントがサーバーに接続すると、サーバーがセッションを待機しているポートが開きます。
4. サーバーはクライアントの接続リクエストを受け入れ、ループを実行します。これで、クライアントはサーバーに情報を送信できるようになり、サーバーもクライアントに情報を送信できるようになります。

2. ソケット変数
ソケットを生成するには、プロトコル、ソケット タイプ、パブリック プロトコル タイプの 3 つの変数が必要です。

1. プロトコル

ソース コードを表示し、ヘルプを印刷するためにクリップボードにコピーします

  1. AF_INET

  2. //ソケットを生成し、送信に TCP または UDP を使用し、IPv4 で使用されるプロトコルアドレス

  3. AF_INET6

  4. //ソケットを生成し、送信に TCP または UDP を使用し、IPv6 アドレスで使用されるプロトコル

  5. AF_UNIX

  6. //ローカルプロトコル、 Unix および Linux システムで使用されますが、通常はクライアントとサーバーが同じマシン上にある場合に使用されることはほとんどありません

  7. ソース コードを表示 クリップボードにコピー ヘルプを印刷

SOCK_STREAM

  1. //このプロトコルは、シーケンシャルで信頼性の高い、データ統合されたバイト ストリーム ベースの接続です。これは最も一般的に使用されるソケットのタイプです。このソケットは送信に TCP を使用します。

  2. SOCK_DGRAM

  3. //このプロトコルは、コネクションレスの固定長の転送呼び出しです。このプロトコルは信頼性が低く、接続に UDP を使用します。

  4. SOCK_SEQPACKET

  5. //このプロトコルは、固定長のデータ パケットを送信して送信する 2 回線の信頼できる接続です。このパケットは、読み取られる前に完全に受け入れられる必要があります。

  6. SOCK_RAW

  7. //このソケット タイプは、ICMP パブリック プロトコルを使用して単一のネットワーク アクセスを提供します。 (ping とtraceroute はこのプロトコルを使用します)

  8. SOCK_RDM

  9. //このタイプはほとんどのオペレーティング システムでは使用されず、データ リンク層に提供されます。データ パケットは保証されません

  10. 3. パブリック プロトコル

    ソース コードをクリップボードにコピーしてヘルプを印刷します

ICMP

  1. //インターネット制御メッセージ プロトコル、主にゲートウェイとホストで使用され、チェックするために使用されますネットワークのステータスとエラー情報のレポート

  2. UDP

  3. //ユーザー データグラム プロトコル、これはコネクションレスで信頼性の低い送信プロトコルです

  4. TCP

  5. //送信制御プロトコル。これは、送信プロセス中にエラーが発生した場合に、データ パケットが確実に受信者に到達できるようにするための最も一般的に使用される信頼性の高いパブリック プロトコルです。

  6. 3. ソケット関数

    1.socket_create

    関数: ソケットデータ構造の生成と同等です
  7. 使用法:socket_create (int ドメイン、int 型、int プロトコル)
パラメータ: ドメイン、プロトコル型。 、タイプ; プロトコル、パブリックプロトコル

戻り値: 成功した場合はソケットリソース、エラーの場合は FALSE

2.socket_bind
関数: ソケットを IP アドレスとポートにバインドする
使用法:ソケットバインド (リソースソケット、文字列アドレス [, int port) ] )
パラメータ: ソケット、ソケットリソース、アドレス、IP アドレス、ポート

戻り値: ブール値

3.socket_accept
関数: ソケット接続を受け入れます
使用法:socket_accept (リソースソケット)
パラメータ: ソケット、ソケットリソース
戻り値: 成功した場合は新しいソケットリソースを返し、エラーの場合は FALSE を返します。

4.関数: ソケット接続を開始します
使用法:socket_connect (リソース ソケット、文字列アドレス [, int port])
パラメーター: ソケット、ソケット リソース、アドレス、IP アドレス、ポート、ポート
戻り値: ブール値

5、socket_listen

関数:指定されたソケットからのすべての接続をリッスンします
使用法:socket_listen (resourceソケット[, int backlog])
パラメータ:socket、ソケットリソース;
戻り値:ブール

6,socket_read

関数:指定された長さのデータを読み取ります
使用法: socket_read (リソースソケット、int の長さ [, int 型])
パラメータ: ソケット、ソケットリソース; 長さ、文字の長さ、タイプ、PHP_BINARY_READ |PHP_NORMAL_READ
戻り値: string

7、socket_write

関数: ソケットキャッシュへのデータの書き込み
:socket_write (リソース ソケット、文字列バッファ [, int length])
パラメータ:ソケット、ソケット リソース;バッファ、文字数;長さ、文字長;
戻り値:ブール値

8.socket_send()

関数:この関数はデータを送信します。接続されたソケット
使用法:socket_send (リソースソケット、文字列 buf、int len、int フラグ)
パラメータ:ソケット、ソケットリソース;buf、文字;len、文字長;
戻り値:ブール値

9、socket_last_error

関数:取得現在のソケットの最後のエラーコード
使用法:socket_last_error ([リソースソケット])
パラメータ:socket, ソケットリソース;
戻り値:int

10,socket_strerror

関数:指定されたエラー番号の詳細なエラーを返す
使用法:socket_strerror (int errno )
パラメータ: errno、socket_last_error no;
戻り値: string

11、socket_close

関数: ソケットリソースを閉じる
使用法:ソケット_クローズ ([リソースソケット])
パラメータ: ソケット、ソケットリソース;
戻り値: null

4、使用手順

ソケットを開く方法を確認します
a. PHP.ini ファイルを編集し、extension=php_sockets.dll の以前のコメントを削除します:
b. 拡張ライブラリをロードするコード

ソースを表示します。コードを作成し、クリップボードにコピーしてヘルプを表示します

  1. if(!extension_loaded('sockets')) {

  2. if(strtoupper(substr(PHP_OS, 0, 3)) == "WIN") {

  3. dl('php_sockets.dll');

  4. }else{

  5. }

  6. }

  7. 5. ソケットプログラミング

    1. サーバー側
関数:

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");  
}

2. クライアント
  1. 機能:
  2. a. クライアントはサーバーに接続します。クライアントはデータを読み取ります。

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でのSOCKETプログラミングの詳細説明

    phpでのソケット通信の詳細説明

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

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