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

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

WBOY
WBOYオリジナル
2016-08-08 09:22:071216ブラウズ

この記事は MaNong.com - Wang Guofeng によって翻訳されたものです。転載については記事の最後にある転載要件をお読みください。技術翻訳チームへの参加を歓迎します。

チャット アプリやゲームを構築したいですか?次に、ソケット サーバーが最初のステップになります。サーバー作成の基本機能を理解すると、その後の最適化手順も同様に簡単になります。

ソケットサーバーは次のように動作し、クライアントの接続を待機するために継続的に実行されます。クライアントが接続すると、サーバーはクライアントをクライアント リストに追加し、クライアントからのメッセージの待機を開始します。

ここから離れないでください。完全なソース コードは次のとおりです:

// Set time limit to indefinite execution
set_time_limit (0);

// Set the ip and port we will listen on
$address = 'localhost';
$port = 10000;
$max_clients = 10;

// Array that will hold client information
$client = Array();

// Create a TCP Stream socket
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
// Bind the socket to an address/port
socket_bind($sock, $address, $port) or die('Could not bind to address');
// Start listening for connections
socket_listen($sock);

echo "Waiting for connections...\r\n";

// Loop continuously
while (true) {
	// Setup clients listen socket for reading
	$read[0] = $sock;
	for ($i = 0; $i < $max_clients; $i++) {
		if (isset($client[$i]['sock']))
			$read[$i + 1] = $client[$i]['sock'];
	}
	// Set up a blocking call to socket_select()
	if (socket_select($read, $write = NULL, $except = NULL, $tv_sec = 5) < 1)
		continue;
	/* if a new connection is being made add it to the client array */
	if (in_array($sock, $read)) {
		for ($i = 0; $i < $max_clients; $i++) {
			if (empty($client[$i]['sock'])) {
				$client[$i]['sock'] = socket_accept($sock);
				echo "New client connected $i\r\n";
				break;
			}
			elseif ($i == $max_clients - 1)
				echo "Too many clients...\r\n";
		}
	} // end if in_array

	// If a client is trying to write - handle it now
	for ($i = 0; $i < $max_clients; $i++) { // for each client
		if (isset($client[$i]['sock'])) {
			if (in_array($client[$i]['sock'], $read)) {
				$input = socket_read($client[$i]['sock'], 1024);
				if ($input == null) {
					echo "Client disconnecting $i\r\n";
					// Zero length string meaning disconnected
					unset($client[$i]);
				} else {
					echo "New input received $i\r\n";
					// send it to the other clients
					for ($j = 0; $j < $max_clients; $j++) {
						if (isset($client[$j]['sock']) && $j != $i) {
							echo "Writing '$input' to client $j\r\n";
							socket_write($client[$j]['sock'], $input, strlen($input));
						}
					}
					if ($input == 'exit') {
						// requested disconnect
						socket_close($client[$i]['sock']);
					}
				}
			} else {
				echo "Client disconnected $i\r\n";
				// Close the socket
				socket_close($client[$i]['sock']);
				unset($client[$i]);
			}
		}
	}
} // end while
// Close the master sockets
socket_close($sock);

やあ、これは最初は大きなプロジェクトのように思えるかもしれませんが、最初は小さな部分に分割できます。最初の部分はサーバーの作成です。行数: 2 ~ 20。

コードのこの部分では、変数、アドレス、ポート、最大クライアント数、およびクライアント配列を設定します。次にソケットを作成し、指定したアドレスとポートにバインドします。

次にしなければならないことは、無限ループを実行することです (実際には意図的に実行したのです!)。行数: 22 ~ 32。コードのこの部分で行う最初のステップは、$read 配列を設定することです。この配列には、すべてのクライアントのソケットとメイン サーバーのソケットが含まれています。この変数は後の select ステートメントで使用され、PHP にこれらのクライアントからのすべてのメッセージをリッスンするように指示します。

socket_select() の最後のパラメータは、値を返す前に最大 5 秒待つようにサーバーに指示します。戻り値が 1 未満の場合は、データが受信されていないことを意味するため、ループの先頭に戻って待ち続けるだけです。

スクリプトの次の部分は、新しいクライアントをアレイに追加することです。行数: 33 ~ 44。

新しいクライアントをリストの最後に配置します。サーバーで処理できるクライアント数を超えていないことを確認してください。

以下に紹介するコードブロックは非常に大きく、サーバーの主要部分です。クライアントがサーバーにメッセージを送信するとき、このコード部分が前に出てメッセージを処理する必要があります。メッセージは、切断メッセージから実際の切断まで、サーバーが処理する必要があるものであれば何でも構いません。行数: 最後まで 46 行。

このコードは各クライアントをループし、クライアントからメッセージを受信したかどうかを確認します。その場合は、入力コンテンツを取得します。入力に基づいて、これが切断メッセージであるかどうかを確認し、切断メッセージである場合は配列から削除します。そうでない場合は、通常のメッセージです。サーバーはすべてのクライアントを再度調べて、メッセージを 1 つずつ書き込みます。スキップします。送信者。

それでは、独自のチャット サーバーを作成してみましょう!

上記では、PHP を使用してソケット サーバーを実装する方法を、関連する側面も含めて紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。

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