ホームページ >バックエンド開発 >PHPチュートリアル >PHPソケットプログラミングの徹底解説_PHPチュートリアル
この記事では主にPHPソケットプログラミングを分かりやすく紹介しており、ソケットに関する関連知識やPHPソケットプログラミングのパッケージ内容について詳しく解説しています。必要な友達はそれを参照してください
ネットワーク技術の発展に伴い、TCP/IP、UDP、ソケットプログラミングという言葉をよく耳にするようになりました。そこで聞きたいのは:
1.TCP/IP、UDPとは何ですか?
2.ソケットはどこですか?
3.ソケットとは何ですか?
4.使えますか?
TCP/IP、UDPとは何ですか?
TCP/IP (Transmission Control Protocol/Internet Protocol) は、ワイドエリアネットワーク (WAN) 用に設計された業界標準プロトコルセットです。
UDP(User Data Protocol、User Datagram Protocol)は、TCPに相当するプロトコルです。これは、TCP/IP プロトコル スイートのメンバーです。
これらのプロトコルの関係を示した図がこれです。
TCP/IPプロトコルスイートには、トランスポート層、ネットワーク層、リンク層が含まれます。これで、TCP/IP と UDP の関係がわかりました。
ソケットはどこですか?
図 1 では、Socket の影が見えませんが、それはどこにあるのでしょうか? 写真を使って話しましょう。一目瞭然です。
ソケットがここにあることがわかりました。
ソケットとは何ですか?
ソケットは、アプリケーション層とTCP/IPプロトコルファミリー間の通信のための中間ソフトウェア抽象化層です。インターフェースのセットです。設計モードでは、Socket は実際にはファサード モードであり、複雑な TCP/IP プロトコル ファミリを Socket インターフェイスの背後に隠し、ユーザーにとっては一連の単純なインターフェイスだけで、指定されたプロトコルを満たすように Socket がデータを編成できます。
使えますか?
先人たちは私たちのために多くのことをしてくれて、ネットワーク間の通信ははるかに簡単になりましたが、結局のところ、やるべきことはまだたくさんあります。以前ソケットプログラミングについて聞いたとき、比較的高度なプログラミング知識だと思っていましたが、ソケットプログラミングの動作原理を理解すれば、その謎は解けます。
人生の一場面。友人に電話したい場合は、最初にその番号をダイヤルします。呼び出し音が聞こえたら、友人は電話に出ます。この時点で、あなたと友人は接続され、通話することができます。通話が終了したら電話を切って会話を終了します。 TCP/IP プロトコル ファミリは人生の中で誕生したのかもしれませんが、必ずしもそうではありません。
サーバー側から始めましょう。サーバーはまずソケットを初期化し、次にポートにバインドし、ポートをリッスンし、accept を呼び出してブロックし、クライアントが接続するのを待ちます。このとき、クライアントがSocketを初期化してからサーバーに接続(connect)すると、接続に成功するとクライアントとサーバー間の接続が確立されます。クライアントがデータ要求を送信し、サーバーが要求を受信して処理し、次に応答データをクライアントに送信し、クライアントがデータを読み取り、最後に接続を閉じて対話が終了します。
ソケット関連機能:
------------------------------------------------- - --------------------------------------
socket_accept() はソケット接続を受け入れます
socket_bind() はソケットを IP アドレスとポートにバインドします
Socket_clear_error()はソケットエラーまたは最後のエラーコードをクリアします
socket_close()はソケットリソースを閉じます
socket_connect()はソケット接続を開始します
Socket_create_listen() は、指定されたポートでリッスンするソケットを開きます
Socket_create_pair() は、区別できないソケットのペアを配列に生成します
Socket_create() はソケットを生成します。これはソケットのデータ構造を生成するのと同等です
socket_get_option() ソケットオプションを取得します
Socket_getpeername() リモートの同様のホストのIPアドレスを取得します
socket_getsockname() ローカルソケットのIPアドレスを取得します
socket_iovec_add() は、新しいベクトルを分散/集約配列に追加します
socket_iovec_alloc() この関数は、送信、受信、読み取り、書き込みが可能な iovec データ構造を作成します
socket_iovec_delete()は割り当てられたiovecを削除します
socket_iovec_fetch()は、指定されたiovecリソースのデータを返します
socket_iovec_free() は iovec リソースを解放します
Socket_iovec_set()はiovecデータの新しい値を設定します
Socket_last_error() は現在のソケットの最後のエラーコードを取得します
socket_listen() は、指定されたソケットからのすべての接続をリッスンします
Socket_read()は指定された長さのデータを読み込みます
Socket_readv() は分散/集約配列からデータを読み取ります
socket_recv()はソケットからキャッシュへのデータを終了します
Socket_recvfrom() は、指定されたソケットからデータを受け取ります。指定されていない場合、デフォルトで現在のソケットが使用されます。
socket_recvmsg()はiovecからメッセージを受け取りますsocket_select() 複数選択
socket_send() この関数は接続されたソケットにデータを送信します
socket_sendmsg() メッセージをソケットに送信します
socket_sendto() は、指定されたアドレスのソケットにメッセージを送信します
Socket_set_block() はソケットをブロックモードに設定します
Socket_set_nonblock() ソケットをノンブロックモードに設定します
socket_set_option() ソケットオプションを設定します
socket_shutdown() この関数を使用すると、読み取り、書き込み、または指定されたソケットを閉じることができます
socket_strerror()は、指定されたエラー番号を持つ詳細なエラーを返します
socket_write() はソケットキャッシュにデータを書き込みます
socket_writev() は分散/集約配列にデータを書き込みます
事例1: ソケット通信のデモンストレーション
サーバー側:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
//クライアントへの接続時にタイムアウトがないことを確認します set_time_limit(0);
$ip = '127.0.0.1'; $ポート = 1935;
/* +------------------------------------------------- * @socket 通信の全プロセス +------------------------------------------------- * @socket_create * @socket_bind * @socket_listen * @socket_accept * @socket_read * @socket_write * @socket_close +-------------------------------- */
/*---------------- 以下の操作はすべてマニュアルに記載されています ------------------*/ if(($sock =socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) <0) { echo "socket_create() が次の理由で失敗しました: ".socket_strerror($sock)."n"; }
if(($ret =ソケットバインド($sock,$ip,$port)) < 0) { echo "socket_bind() が次の理由で失敗しました: ".socket_strerror($ret)."n"; }
if(($ret =socket_listen($sock,4)) < 0) { echo "socket_listen() が次の理由で失敗しました: ".socket_strerror($ret)."n"; }
$count = 0;
する{ if (($msgsock =ソケット_accept($sock)) < 0) { echo "socket_accept() が失敗しました: 理由: " 。socket_strerror($msgsock) "; 休憩; } 他 {
//クライアントに送信 $msg="テストは成功しました!n"; socket_write($msgsock, $msg, strlen($msg));
echo "テストは成功しましたn"; $buf =ソケット_読み取り($msgsock,8192);
$talkback = "メッセージを受信しました: $bufn"; エコー $トークバック;
if(++$count >= 5){ 休憩; };
} //エコー $buf; socket_close($msgsock);
} while (true);
socket_close($sock); ?> |
これはソケットのサーバー側のコードです。次に cmd を実行し、独自のプログラムのストレージ パスに注意してください。
応答はありません。サーバー プログラムが実行を開始し、ポートがリッスンを開始しました。 netstat -ano を実行してポートのステータスを確認します。私のポートは 1935 です。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
エラー報告(E_ALL); set_time_limit(0); echo " TCP/IP 接続n";
$ポート = 1935; $ip = "127.0.0.1";
/* +------------------------------------------------- * @socket はプロセス全体を接続します +------------------------------------------------- * @socket_create * @socket_connect * @socket_write * @socket_read * @socket_close +-------------------------------- */
$socket =ソケット_作成(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket < 0) { echo "socket_create() が失敗しました: 理由: " 。socket_strerror($socket) 。 }その他{ 「OK.n」をエコー; }
echo "'$ip' ポート '$port' に接続しようとしています...n"; $result =socket_connect($socket, $ip, $port); if ($result < 0) { echo "socket_connect() failed.nReason: ($result) " 。socket_strerror($result) "; }その他{ 「接続OKn」をエコーします; }
$in = "ホーン"; $in .= "初血"; $out = '';
if(!socket_write($socket, $in, strlen($in))) { echo "socket_write() が失敗しました: 理由: " 。socket_strerror($socket) 。 }その他{ echo "情報はサーバーに正常に送信されました!n"; echo "送信されたコンテンツは次のとおりです:$in "; }
while($out =socket_read($socket, 8192)) { echo "サーバー応答メッセージを正常に受信しました!n"; echo "受け入れられたコンテンツは次のとおりです:",$out; }
echo "ソケットを閉じます...n"; socket_close($socket); 「閉じる OKn」をエコーします; ?>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//いくつかの基本的な変数を設定します $host = "192.168.1.99"; $ポート = 1234; // タイムアウトを設定する set_time_limit(0); // ソケットを作成します $socket =ソケット_create(AF_INET, SOCK_STREAM, 0) または die("Could not createocketn"); //ソケットをポートにバインドする $result =socket_bind($socket, $host, $port) または die("ソケットにバインドできませんでした"); // リンクの監視を開始します $result =socket_listen($socket, 3) または die("ソケットリスナーをセットアップできませんでした"); // 受信接続を受け入れます //通信を処理するための別のソケット $spawn =socket_accept($socket) または die("受信接続を受け入れられませんでした"); //クライアントからの入力を取得します $input =socket_read($spawn, 1024) または die("入力n を読み取れませんでした"); //入力文字列をクリアします $input = トリム($input); //クライアント入力を処理し、結果を返します $output = strrev($input) . "n"; socket_write($spawn, $output, strlen ($output)) または die("書き込めませんでした 出力"); //ソケットを閉じる socket_close($spawn); socket_close($socket); |
各ステップの詳細な説明は次のとおりです:
1. 最初のステップは、Socket が実行されているサーバーの IP アドレスとポートを保存する 2 つの変数を作成することです。独自のサーバーとポートに設定できます (ポートは 1 ~ 65535 の数値にすることができます)。このポートが使用されていない場合に限ります。
コードは以下の通りです:
// 2つの変数を設定します
$host = "192.168.1.99";
$port = 1234;
2. サーバー側で set_time_out() 関数を使用すると、クライアントの接続を待機している間に PHP がタイムアウトしないようにすることができます。
コードは次のとおりです:// タイムアウト期間
set_time_limit(0);
3. 前の内容に基づいて、今度は、socket_creat() 関数を使用してソケットを作成します。この関数は、後続のすべての関数で使用されるソケット ハンドルを返します。
コードは以下の通りです:
//ソケットを作成する
$socket =ソケット_create(AF_INET, SOCK_STREAM, 0) or die("作成できませんでした
ソケットン");
最初のパラメータ「AF_INET」はドメイン名を指定するために使用されます。
2番目のパラメータ「SOCK_STREM」は、作成されるソケットのタイプ(この例ではTCPタイプ)を関数に伝えます
したがって、UDP ソケットを作成したい場合は、次のコードを使用できます:
コードは次のとおりです:
//ソケットを作成する
$socket =ソケット_create(AF_INET, SOCK_DGRAM, 0) or die("作成できませんでした
ソケットン");
4. ソケットハンドルが作成されたら、次のステップは、それを指定したアドレスとポートにバインドすることです。これは、socket_bind() 関数を通じて実行できます。
コードは以下の通りです:// 指定されたアドレスとポートにソケットをバインドします
$result =socket_bind($socket, $host, $port) or die("バインドできませんでした
ソケットン");
5. ソケットが作成され、ポートにバインドされたら、外部接続のリスニングを開始できます。PHP では、socket_listen() 関数を通じてリスニングを開始できます。数値 (この例では 2 番目のパラメーター: 3) を指定できます。 )
コードは以下の通りです:
// 接続の監視を開始します
$result =socket_listen($socket, 3) or die("ソケットをセットアップできませんでした
リスナー");
6. これまで、サーバーは基本的にクライアントからの接続要求を待つこと以外は何もしませんでしたが、クライアント接続が受信されると、socket_accept() 関数が機能し、接続要求を受信して別の A サブサーバーを呼び出します。クライアントとサーバーの間で情報を処理するためのソケット。
コードは以下の通りです:
//リクエストリンクを承認します
// 情報を処理するためにサブソケットを呼び出します
$spawn =socket_accept($socket) または die("受信を受け入れられませんでした
「接続」);
このサブソケットは、後続のクライアント/サーバー通信に使用できるようになります。
7. 接続が確立されると、サーバーはクライアントが何らかの入力情報を送信するのを待ちます。この情報はsocket_read()関数によって取得され、PHPの$input変数に代入されます。
コードは以下の通りです:
// クライアント入力を読み取ります
$input =socket_read($spawn, 1024) または die("入力n を読み取れませんでした");
?>
socker_read の 2 番目のパラメータは、読み取るバイト数を指定するために使用されます。
クライアントから取得するデータのサイズを制限するために使用できます。注:socket_read 関数は、n、t、または
8. 次に、サーバーはクライアントから送信されたデータを処理する必要があります(この例では、処理にはクライアントへのデータの入力と返却のみが含まれます)。この部分は、socket_write()関数によって完了できます(通信によって行われます)。ソケット データストリームをクライアントに送り返すことが可能です)コードは次のとおりです:
// クライアント入力を処理してデータを返す
$output = strrev($input) .
socket_write($spawn, $output, strlen ($output)) または die("書き込めませんでした
出力n");
9. 出力がクライアントに返されたら、socket_close()関数を通じて親/子のソケットを終了する必要があります
コードは次のとおりです:
// ソケットを閉じる
socket_close($spawn);
socket_close($socket);
http://www.bkjia.com/PHPjc/1000097.html
www.bkjia.comtrue