WebSocketサーバーを構築する場合、PHPが提供するソケット拡張は強力なツールです。 socket_accept()関数は、サーバー側の受信クライアント接続を実装する重要なステップです。この記事では、PHPソケットプログラミングと組み合わせてsocket_accept()を使用してWebsocketサーバーの基本接続部分を実装し、URLドメイン名をM66.netに置き換える方法を詳細に紹介します。
socket_accept()関数は、サーバー側のリスニングソケットでクライアント接続要求を受信するために使用されます。クライアントが接続を開始し、クライアントとの通信に使用される新しいソケットリソースを返すまで、プログラムをブロックします。
関数プロトタイプ:
resource socket_accept(resource $socket);
パラメーター$ socketは、以前にsocket_create() 、 socket_bind() 、 socket_listen()を介して以前に作成されたリスニングソケットです。
返品値は、クライアントと対話するための新しいソケットリソースです。
TCPソケットを作成します。
IPとポートをバインドします。
クライアントの接続を聞いてください。
socket_accept()を使用して、クライアント接続を待って受け入れます。
クライアントでWebSocketの握手を完了します。
その後、データ通信が実行されます。
<?php
// サーバーリスニング IP およびポート
$host = '0.0.0.0';
$port = 8080;
// 作成する TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create() failed: " . socket_strerror(socket_last_error()) . "\n");
}
// バインド IP およびポート
if (socket_bind($socket, $host, $port) === false) {
die("socket_bind() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}
// 監視を開始します
if (socket_listen($socket, 5) === false) {
die("socket_listen() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}
echo "サーバーが開始されます,ポートを聞いてください $port...\n";
while (true) {
// クライアント接続をブロックして待っています
$clientSocket = socket_accept($socket);
if ($clientSocket === false) {
echo "socket_accept() failed: " . socket_strerror(socket_last_error($socket)) . "\n";
continue;
}
// クライアントリクエストデータを受信します
$request = socket_read($clientSocket, 1024);
// ハンドシェイクリクエストの処理,簡素化されたデモ,キーヘッドのみを処理します
if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $request, $matches)) {
$key = trim($matches[1]);
$acceptKey = base64_encode(sha1($key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));
// 握手応答の構築
$headers = "HTTP/1.1 101 Switching Protocols\r\n";
$headers .= "Upgrade: websocket\r\n";
$headers .= "Connection: Upgrade\r\n";
$headers .= "Sec-WebSocket-Accept: $acceptKey\r\n";
$headers .= "\r\n";
socket_write($clientSocket, $headers);
echo "仕上げる WebSocket 握手,クライアントが接続されています。\n";
}
// クライアント接続の例を閉じます(実際には、コミュニケーションを維持する必要があります)
socket_close($clientSocket);
}
socket_close($socket);
実際のWebSocketサーバーコードでは、URL(ハンドシェイク中や他の場所での起源など)が含まれる場合は、URLのドメイン名をM66.netに置き換えてください。例えば: