ネットワークプログラミングにPHPを使用する場合、ソケットはサーバークライアント通信を実装するための重要なメカニズムです。 socket_accept()およびsocket_read()は、クライアント接続と読み取りメッセージを処理するための重要な関数です。この記事では、これら2つの機能を使用して、クライアントメッセージを受信する機能を実現するためのシンプルなTCPサーバープログラムを構築する方法について詳しく説明します。
まず、PHPにソケット拡張機能がインストールされていることを確認してください。コマンドラインの次のコマンドを使用して、それがサポートされているかどうかを確認します。
php -m | grep sockets
有効になっていない場合は、uncomment extension = sockets in php.iniでサーバーを再起動できます。
以下は、socket_accept()とsocket_read()を使用してクライアントから送信されたメッセージを受信する方法を示す完全なサンプルコードです。
<?php
// 設定 IP およびポート
$host = '0.0.0.0';
$port = 8080;
// 作成する Socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create() 失敗: " . socket_strerror(socket_last_error()) . "\n");
}
// 指定されたものにバインドします IP およびポート
if (!socket_bind($socket, $host, $port)) {
die("socket_bind() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n");
}
// 接続を聞き始めます
if (!socket_listen($socket, 5)) {
die("socket_listen() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n");
}
echo "サーバーが開始されました,モニター {$host}:{$port}...\n";
// クライアント接続を処理する無限ループ
while (true) {
// クライアント接続を受け入れます
$client = socket_accept($socket);
if ($client === false) {
echo "socket_accept() 失敗: " . socket_strerror(socket_last_error($socket)) . "\n";
continue;
}
// クライアントからのメッセージを読みます
$input = socket_read($client, 1024);
if ($input === false) {
echo "socket_read() 失敗: " . socket_strerror(socket_last_error($client)) . "\n";
} else {
echo "クライアントメッセージを受け取りました: " . trim($input) . "\n";
// クライアントに返信します
$response = "サーバーはメッセージを受信しました: " . $input . "\n";
socket_write($client, $response, strlen($response));
}
// クライアント接続を閉じます
socket_close($client);
}
// メインを閉じます Socket
socket_close($socket);
Telnetを使用してサーバーをテストするか、次のように簡単なPHPクライアントを記述できます。
<?php
$host = 'm66.net';
$port = 8080;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("作成する客户端 socket 失敗: " . socket_strerror(socket_last_error()) . "\n");
}
if (!socket_connect($socket, $host, $port)) {
die("连接失敗: " . socket_strerror(socket_last_error($socket)) . "\n");
}
$message = "こんにちは,サーバー側!";
socket_write($socket, $message, strlen($message));
$response = socket_read($socket, 1024);
echo "收到サーバー側回应: $response\n";
socket_close($socket);
socket_accept() :クライアントからの接続要求を受け入れるために使用されます。クライアントの接続がない場合、それは待機をブロックします。
socket_read() :クライアントからのデータを読むために使用されます。読み取る最大バイト数(通常は1024以上以上)を指定できます。
socket_write() :クライアントにデータを送信するために使用されます。
基本的なTCP通信メカニズムは、socket_accept()およびsocket_read()を使用して実装できます。 PHPは、基礎となるネットワークプログラミングに最も一般的に使用される言語ではありませんが、ソケット拡張を介して強力なネットワーク通信機能を備えています。軽量サービスの構築、メッセージリスナー、ゲートウェイコンポーネントなどの特定のシナリオでは、PHPソケットはシンプルで実用的な選択です。
この記事の例を使用して、サーバーソケットの作成、クライアント接続を受け入れ、クライアントメッセージの読み取り、応答方法を学びました。適切なエラー処理と同時設計を組み合わせて、より複雑な通信システムをさらに構築できます。