検索
ホームページバックエンド開発PHPチュートリアルPHPソケット通信ケースの詳細説明

PHPソケット通信ケースの詳細説明

Jun 07, 2018 pm 04:31 PM
phpsocket通信

この記事では主にPHPのソケット通信について詳しく解説していますので、興味のある方は参考にしていただければ幸いです。

TCP/IP、UDP、ソケット プログラミングという言葉をご存知ですか?ネットワーク技術の発展に伴い、こんな言葉が私たちの耳に溢れています。

それでは、TCP/IP と UDP とは何でしょうか?
TCP/IP (伝送制御プロトコル/インターネット プロトコル) は、ワイド エリア ネットワーク (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 アドレスにバインドし、port
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 <?php 2 //确保在连接客户端时不会超时 3 set_time_limit(0); 4 5 $ip = &#39;127.0.0.1&#39;; 6 $port = 1935; 7 8 /* 9 +------------------------------- 10 *  @socket通信整个过程 11 +------------------------------- 12 *  @socket_create 13 *  @socket_bind 14 *  @socket_listen 15 *  @socket_accept 16 *  @socket_read 17 *  @socket_write 18 *  @socket_close 19 +-------------------------------- 20 */ 21 22 /*----------------  以下操作都是手册上的  -------------------*/ 23 if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) { 24 echo "socket_create() 失败的原因是:".socket_strerror($sock)."\n"; 25 } 26 27 if(($ret = socket_bind($sock,$ip,$port)) < 0) { 28 echo "socket_bind() 失败的原因是:".socket_strerror($ret)."\n"; 29 } 30 31 if(($ret = socket_listen($sock,4)) < 0) { 32 echo "socket_listen() 失败的原因是:".socket_strerror($ret)."\n"; 33 } 34 35 $count = 0; 36 37 do { 38 if (($msgsock = socket_accept($sock)) < 0) { 39 echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n"; 40 break; 41 } else { 42 43 //发到客户端 44 $msg ="测试成功!\n"; 45 socket_write($msgsock, $msg, strlen($msg)); 46 47 echo "测试成功了啊\n"; 48 $buf = socket_read($msgsock,8192); 49 50 51 $talkback = "收到的信息:$buf\n"; 52 echo $talkback; 53 54 if(++$count >= 5){ 55 break; 56 }; 57 58 59 } 60 //echo $buf; 61 socket_close($msgsock); 62 63 } while (true); 64 65 socket_close($sock); 66 ?>

これはソケットのサーバー コードです。次に cmd を実行し、独自のプログラムのストレージ パスに注意してください。

応答はありません。サーバー プログラムが実行を開始し、ポートがリッスンを開始しました。 netstat -ano を実行してポートのステータスを確認します。私の場合はポート 1935

です。ポートはすでに LISTENING 状態になっています。次に、クライアント プログラムを実行して接続するだけです。上記のコード

 1 <?php 2 error_reporting(E_ALL); 3 set_time_limit(0); 4 echo "<h2 id="TCP-IP-nbsp-Connection">TCP/IP Connection</h2>\n"; 5 6 $port = 1935; 7 $ip = "127.0.0.1"; 8 9 /* 10 +------------------------------- 11 *  @socket连接整个过程 12 +------------------------------- 13 *  @socket_create 14 *  @socket_connect 15 *  @socket_write 16 *  @socket_read 17 *  @socket_close 18 +-------------------------------- 19 */ 20 21 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 22 if ($socket < 0) { 23 echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n"; 24 }else { 25 echo "OK.\n"; 26 } 27 28 echo "试图连接 &#39;$ip&#39; 端口 &#39;$port&#39;...\n"; 29 $result = socket_connect($socket, $ip, $port); 30 if ($result < 0) { 31 echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n"; 32 }else { 33 echo "连接OK\n"; 34 } 35 36 $in = "Ho\r\n"; 37 $in .= "first blood\r\n"; 38 $out = &#39;&#39;; 39 40 if(!socket_write($socket, $in, strlen($in))) { 41 echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n"; 42 }else { 43 echo "发送到服务器信息成功!\n"; 44 echo "发送的内容为:<font color=&#39;red&#39;>$in</font> <br>"; 45 } 46 47 while($out = socket_read($socket, 8192)) { 48 echo "接收服务器回传信息成功!\n"; 49 echo "接受的内容为:",$out; 50 } 51 52 53 echo "关闭SOCKET...\n"; 54 socket_close($socket); 55 echo "关闭OK\n"; 56 ?>

これで、クライアントがサーバーに接続されました。

ケース 2: コードの詳細説明

// 设置一些基本的变量
$host = "192.168.1.99";
$port = 1234;
// 设置超时时间
set_time_limit(0);
// 创建一个Socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not createsocket\n");
//绑定Socket到端口
$result = socket_bind($socket, $host, $port) or die("Could not bind tosocket\n");
// 开始监听链接
$result = socket_listen($socket, 3) or die("Could not set up socketlistener\n");
// accept incoming connections
// 另一个Socket来处理通信
$spawn = socket_accept($socket) or die("Could not accept incomingconnection\n");
// 获得客户端的输入
$input = socket_read($spawn, 1024) or die("Could not read input\n");
// 清空输入字符串
$input = trim($input);
//处理客户端输入并返回结果
$output = strrev($input) . "\n";
socket_write($spawn, $output, strlen ($output)) or die("Could not write
output\n");
// 关闭sockets
socket_close($spawn);
socket_close($socket);

以下は各ステップの詳細な説明です:

1 最初のステップは 2 つを確立することです。変数 ソケットが実行されているサーバーの IP アドレスとポートを保存するには、このポートが使用されていない場合に限り、独自のサーバーとポートに設定できます (このポートは 1 ~ 65535 の数値にすることができます)。

## [クリップボードにコピー]

PHP コード:

// 设置两个变量
$host = "192.168.1.99" ;
$port = 1234 ;

2 サーバー側で set_time_out() 関数を使用すると、クライアントの待機中に PHP がタイムアウトしないようにできます。接続します。

[クリップボードにコピー]

PHP CODE:

// 超时时间
set_time_limit ( 0 );

3. 前の手順に基づいて、socket_creat() 関数を使用してソケットを作成します。関数はソケット ハンドルを返します。このハンドルは、今後この関数内で使用されます。

[クリップボードにコピー]

PHP CODE:

// 创建Socket
$socket = socket_create ( AF_INET , SOCK_STREAM , 0 ) or die( "Could not create
socket\n" );

最初のパラメータ「AF_INET」は、次の目的で使用されます。ドメイン名を指定します。

2 番目のパラメータ「SOCK_STREM」は、作成されるソケットのタイプ (この例では TCP タイプ)を関数に指示します。

したがって、UDP ソケットを作成したい場合は、次のようにすることができます。次のコードを使用します:

[クリップボードにコピー]

PHP コード:

// 创建 socket
$socket = socket_create ( AF_INET , SOCK_DGRAM , 0 ) or die( "Could not create
socket\n" );

4。ソケット ハンドルが作成されたら、次のステップはそれを指定するか、指定されたハンドルにバインドすることです。これは、ソケットが作成され、バインドされた後、socket_bind() 関数を通じて実行できます。 PHP では、socket_listen() 関数でリスナーを開始し、数値 (この場合は 2 番目のパラメーター: 3) を指定できます。

[クリップボードにコピー]

PHP コード:

// 开始监听连接
$result = socket_listen ( $socket , 3 ) or die( "Could not set up socket
listener\n" );

6.到现在,你的服务器除了等待来自客户端的连接请求外基本上什么也没有做.一旦一个客户端的连接被收到,socket_accept()函数便开始起作用了,它接收连接请求并调用另一个子Socket来处理客户端–服务器间的信息.

[Copy to clipboard]
PHP CODE:

//接受请求链接
// 调用子socket 处理信息
$spawn = socket_accept ( $socket ) or die( "Could not accept incoming
connection\n" );

这个子socket现在就可以被随后的客户端–服务器通信所用了.

7.当一个连接被建立后,服务器就会等待客户端发送一些输入信息,这写信息可以由socket_read()函数来获得,并把它赋值给PHP的$input变量.

[Copy to clipboard]
PHP CODE:

// 读取客户端输入
$input = socket_read ( $spawn , 1024 ) or die( "Could not read input\n" );
?& gt ;

socker_read的第而个参数用以指定读入的字节数,你可以通过它来限制从客户端获取数据的大小.

注意:socket_read函数会一直读取壳户端数据,直到遇见\n,\t或者\0字符.PHP脚本把这写字符看做是输入的结束符.

8.现在服务器必须处理这些由客户端发来是数据(在这个例子中的处理仅仅包含数据的输入和回传到客户端).这部分可以由socket_write()函数来完成(使得由通信socket发回一个数据流到客户端成为可能)

[Copy to clipboard]
PHP CODE:

// 处理客户端输入并返回数据
$output = strrev ( $input ) . "\n" ;
socket_write ( $spawn , $output , strlen ( $output )) or die( "Could not write
output\n" );

9.一旦输出被返回到客户端,父/子socket都应通过socket_close()函数来终止

[Copy to clipboard]
PHP CODE:

// 关闭 sockets
socket_close ( $spawn );
socket_close ( $socket );

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

相关推荐:

PHP 实现页面静态化的几种方法详解

PHP读取CSV大文件导入数据库的方法

PHP实现十六进制颜色随机生成器功能的方法

以上がPHPソケット通信ケースの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
セッションを保存するためにデータベースを使用することの利点は何ですか?セッションを保存するためにデータベースを使用することの利点は何ですか?Apr 24, 2025 am 12:16 AM

データベースストレージセッションを使用することの主な利点には、持続性、スケーラビリティ、セキュリティが含まれます。 1。永続性:サーバーが再起動しても、セッションデータは変更されないままになります。 2。スケーラビリティ:分散システムに適用され、セッションデータが複数のサーバー間で同期されるようにします。 3。セキュリティ:データベースは、機密情報を保護するための暗号化されたストレージを提供します。

PHPでカスタムセッション処理をどのように実装しますか?PHPでカスタムセッション処理をどのように実装しますか?Apr 24, 2025 am 12:16 AM

PHPでのカスタムセッション処理の実装は、SessionHandlerInterfaceインターフェイスを実装することで実行できます。具体的な手順には、次のものが含まれます。1)CussentsessionHandlerなどのSessionHandlerInterfaceを実装するクラスの作成。 2)セッションデータのライフサイクルとストレージ方法を定義するためのインターフェイス(オープン、クローズ、読み取り、書き込み、破壊、GCなど)の書き換え方法。 3)PHPスクリプトでカスタムセッションプロセッサを登録し、セッションを開始します。これにより、データをMySQLやRedisなどのメディアに保存して、パフォーマンス、セキュリティ、スケーラビリティを改善できます。

セッションIDとは何ですか?セッションIDとは何ですか?Apr 24, 2025 am 12:13 AM

SessionIDは、ユーザーセッションのステータスを追跡するためにWebアプリケーションで使用されるメカニズムです。 1.ユーザーとサーバー間の複数のインタラクション中にユーザーのID情報を維持するために使用されるランダムに生成された文字列です。 2。サーバーは、ユーザーの複数のリクエストでこれらの要求を識別および関連付けるのに役立つCookieまたはURLパラメーターを介してクライアントに生成および送信します。 3.生成は通常、ランダムアルゴリズムを使用して、一意性と予測不可能性を確保します。 4.実際の開発では、Redisなどのメモリ内データベースを使用してセッションデータを保存してパフォーマンスとセキュリティを改善できます。

ステートレス環境(APIなど)でセッションをどのように処理しますか?ステートレス環境(APIなど)でセッションをどのように処理しますか?Apr 24, 2025 am 12:12 AM

APIなどのステートレス環境でのセッションの管理は、JWTまたはCookieを使用して達成できます。 1。JWTは、無国籍とスケーラビリティに適していますが、ビッグデータに関してはサイズが大きいです。 2.cookiesはより伝統的で実装が簡単ですが、セキュリティを確保するために慎重に構成する必要があります。

セッションに関連するクロスサイトスクリプティング(XSS)攻撃からどのように保護できますか?セッションに関連するクロスサイトスクリプティング(XSS)攻撃からどのように保護できますか?Apr 23, 2025 am 12:16 AM

セッション関連のXSS攻撃からアプリケーションを保護するには、次の測定が必要です。1。セッションCookieを保護するためにHTTPonlyとセキュアフラグを設定します。 2。すべてのユーザー入力のエクスポートコード。 3.コンテンツセキュリティポリシー(CSP)を実装して、スクリプトソースを制限します。これらのポリシーを通じて、セッション関連のXSS攻撃を効果的に保護し、ユーザーデータを確保できます。

PHPセッションのパフォーマンスを最適化するにはどうすればよいですか?PHPセッションのパフォーマンスを最適化するにはどうすればよいですか?Apr 23, 2025 am 12:13 AM

PHPセッションのパフォーマンスを最適化する方法は次のとおりです。1。遅延セッション開始、2。データベースを使用してセッションを保存します。これらの戦略は、高い並行性環境でのアプリケーションの効率を大幅に改善できます。

session.gc_maxlifetime構成設定とは何ですか?session.gc_maxlifetime構成設定とは何ですか?Apr 23, 2025 am 12:10 AM

thesession.gc_maxlifettinginttinginphpdethinesthelifsessessiondata、setinseconds.1)it'sconfiguredinphp.iniorviaini_set()。 2)AbalanceSneededToAvoidPerformanceIssues andunexpectedLogouts.3)php'sgarbagecollectionisisprobabilistic、影響を受けたBygc_probabi

PHPでセッション名をどのように構成しますか?PHPでセッション名をどのように構成しますか?Apr 23, 2025 am 12:08 AM

PHPでは、session_name()関数を使用してセッション名を構成できます。特定の手順は次のとおりです。1。session_name()関数を使用して、session_name( "my_session")などのセッション名を設定します。 2。セッション名を設定した後、session_start()を呼び出してセッションを開始します。セッション名の構成は、複数のアプリケーション間のセッションデータの競合を回避し、セキュリティを強化することができますが、セッション名の一意性、セキュリティ、長さ、設定タイミングに注意してください。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。