PHPでは、ソケットベースのネットワーク通信は非常に根本的で柔軟な通信方法であり、カスタムプロトコルが実装されている、または高性能通信が必要なシナリオに適しています。この記事では、socket_accept()とstream_socket_client()関数を組み合わせて、シンプルなサーバークライアント通信プロセスを実装する方法を示します。
socket_accept() :サーバーソケットのクライアント接続要求を受け入れ、クライアント接続を示すために新しいソケットリソースを返すために使用されます。
stream_socket_client() :クライアント接続を作成して、指定されたサーバーのソケットに接続するために使用されます。
サーバーは、ポートを聞いて接続要求を受け入れる責任があります。クライアントは、接続要求を開始し、サーバーに接続します。データ交換は、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);
<?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);
サーバー:
socket_create()を使用して、ソケットリソースを作成します。
IPとポートをバインドした後、 socket_listen()を呼び出してクライアント接続を聞きます。
socket_accept()を使用して、クライアント接続の待機をブロックします。
接続が確立されたら、 socket_read()を使用してクライアントデータとsocket_write()を受信して応答を送信します。
通信を完了したら、クライアントソケットを閉じて、次の接続を待ち続けます。
クライアント:
Stream_Socket_Client()を使用してサーバーに接続します。
接続が成功したら、サーバーにメッセージを送信します。
サーバーによって返されたデータを読み取り、完全なリクエスト応答プロセスを完了します。
接続を閉じます。
サーバーはSocket_*シリーズ関数を使用し、クライアントはStream_Socket_Client()を使用します。どちらも下部にソケットリソースを操作しますが、インターフェイススタイルは異なります。例は、PHPでの一般的なソケットの使用量を示すために一緒に使用されます。
生産環境では、ソケットの読み取りおよび書き込みエラーの処理とタイムアウト制御を追加して、デッドループや閉塞を避ける必要があります。
サーバーがクラウドサーバーまたはイントラネットに展開されている場合、ポートが開いており、ドメイン名M66.NET解像度がサーバーIPを正しく指していることを確認する必要があります。
Server Socket_Accept()は、単一の接続例に適したブロッキングコールです。実際のプロジェクトでは、マルチスレッド、マルチプロセス、または非同期IOで最適化できます。