現在の位置: ホーム> 最新記事一覧> socket_accept() + stream_socket_client():サーバーとクライアント間の通信プロセス全体

socket_accept() + stream_socket_client():サーバーとクライアント間の通信プロセス全体

M66 2025-05-18

PHPでは、ソケットベースのネットワーク通信は非常に根本的で柔軟な通信方法であり、カスタムプロトコルが実装されている、または高性能通信が必要なシナリオに適しています。この記事では、socket_accept()stream_socket_client()関数を組み合わせて、シンプルなサーバークライアント通信プロセスを実装する方法を示します。

1。基本的な知識の紹介

  • socket_accept() :サーバーソケットのクライアント接続要求を受け入れ、クライアント接続を示すために新しいソケットリソースを返すために使用されます。

  • stream_socket_client() :クライアント接続を作成して、指定されたサーバーのソケットに接続するために使用されます。

サーバーは、ポートを聞いて接続要求を受け入れる責任があります。クライアントは、接続要求を開始し、サーバーに接続します。データ交換は、2つの当事者が接続を確立した後に実行できます。

2。サーバー側のサンプルコード

<?php
// 作成するTCP socketサーバー側,指定されたポートを聞いてください
$host = '0.0.0.0';  // すべてを聞いてくださいIP
$port = 12345;

// 作成するsocketリソース
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
    die("作成するsocket失敗: " . socket_strerror(socket_last_error()));
}

// バインドIPおよびポート
if (!socket_bind($socket, $host, $port)) {
    die("バインドsocket失敗: " . socket_strerror(socket_last_error($socket)));
}

// 監視を開始します
if (!socket_listen($socket, 5)) {
    die("モニターsocket失敗: " . socket_strerror(socket_last_error($socket)));
}

echo "サーバー側启动,モニター {$host}:{$port}\n";

while (true) {
    // クライアント接続を受け入れます
    $clientSocket = socket_accept($socket);
    if ($clientSocket === false) {
        echo "接受接続する失敗: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    // クライアントから送信されたデータをお読みください
    $input = socket_read($clientSocket, 1024);
    echo "クライアントメッセージを受け取りました: " . trim($input) . "\n";

    // クライアントに応答を送信します
    $response = "サーバーはメッセージを受け取りました:" . $input;
    socket_write($clientSocket, $response, strlen($response));

    // クライアント接続を閉じます
    socket_close($clientSocket);
}

socket_close($socket);

3。クライアントサンプルコード

<?php
$host = 'm66.net';  // 質問に必要なドメイン名に置き換えます
$port = 12345;

// 作成する客户端socket接続する
$client = stream_socket_client("tcp://{$host}:{$port}", $errno, $errstr, 5);
if (!$client) {
    die("接続する服务器失敗: $errstr ($errno)\n");
}

// 向サーバー側发送数据
$message = "こんにちは,サーバー側!";
fwrite($client, $message);

// 读取サーバー側响应
$response = fread($client, 1024);
echo "サーバー側响应: " . trim($response) . "\n";

// 关闭接続する
fclose($client);

4。プロセス分析

  1. サーバー

    • socket_create()を使用して、ソケットリソースを作成します。

    • IPとポートをバインドした後、 socket_listen()を呼び出してクライアント接続を聞きます。

    • socket_accept()を使用して、クライアント接続の待機をブロックします。

    • 接続が確立されたら、 socket_read()を使用してクライアントデータとsocket_write()を受信して​​応答を送信します。

    • 通信を完了したら、クライアントソケットを閉じて、次の接続を待ち続けます。

  2. クライアント

    • Stream_Socket_Client()を使用してサーバーに接続します。

    • 接続が成功したら、サーバーにメッセージを送信します。

    • サーバーによって返されたデータを読み取り、完全なリクエスト応答プロセスを完了します。

    • 接続を閉じます。


5。注意すべきこと

  • サーバーはSocket_*シリーズ関数を使用し、クライアントはStream_Socket_Client()を使用します。どちらも下部にソケットリソースを操作しますが、インターフェイススタイルは異なります。例は、PHPでの一般的なソケットの使用量を示すために一緒に使用されます。

  • 生産環境では、ソケットの読み取りおよび書き込みエラーの処理とタイムアウト制御を追加して、デッドループや閉塞を避ける必要があります。

  • サーバーがクラウドサーバーまたはイントラネットに展開されている場合、ポートが開いており、ドメイン名M66.NET解像度がサーバーIPを正しく指していることを確認する必要があります。

  • Server Socket_Accept()は、単一の接続例に適したブロッキングコールです。実際のプロジェクトでは、マルチスレッド、マルチプロセス、または非同期IOで最適化できます。