検索
ホームページバックエンド開発PHPチュートリアル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)) echo "socket_create() が次の理由で失敗しました: ".socket_strerror($sock)."n";

}

if(($ret =ソケットバインド($sock,$ip,$port)) echo "socket_bind() が次の理由で失敗しました: ".socket_strerror($ret)."n";

}

if(($ret =socket_listen($sock,4)) echo "socket_listen() が次の理由で失敗しました: ".socket_strerror($ret)."n";

}

$count = 0;

する{

if (($msgsock =ソケット_accept($sock)) 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 です。

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

?

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

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

?

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 echo "socket_create() が失敗しました: 理由: " 。socket_strerror($socket) 。

}その他{

「OK.n」をエコー;

}

echo "'$ip' ポート '$port' に接続しようとしています...n";

$result =socket_connect($socket, $ip, $port);

if ($result 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.com

tru​​e

技術記事 PHPソケットプログラミングを簡単に紹介するこの記事では、主にPHPソケットプログラミングを簡単に紹介し、ソケットの関連知識、PHPソケットプログラミングサンプルのパッケージ内容、必要な友達について詳しく説明します...
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

メモ帳++7.3.1

メモ帳++7.3.1

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