PHPでソケットプログラミング。オンラインゲームが作りたい(1)
今回はPHPマニュアルに載ってるソケットサーバーのサンプルを少し書き換えて、コメント付け。
1って付けちゃったよ。
たぶん連載ものになる予定。
「JAVAやRubyで良いじゃん」ってのは禁句です。
人には色々事情があるんです。
で、ソケットプログラミング。
うん、さっぱりわからん。
誰もやらないのか、PHPでソケットプログラミングをする情報が非常に少ないのでPHPマニュアルのサンプルみながら少し書き換えてコメントふってみた。
結構いいかげんだけど、それは適当にメモなんで。
<?php // エラーのタイプ error_reporting (E_ALL); // サポートされる全てのエラーと警告 // スクリプトが実行可能な秒数を無制限に設定 set_time_limit (0); // 出力関数のコールが行われるたびに自動的にフラッシュ操作が行う ob_implicit_flush (); // サーバーのIPアドレス $address = '192.168.24.66'; // 使用するポート $port = 10001; // IPv4インターネットプロトコル $domain = AF_INET; // 時系列的、高信頼性、全二重、接続型のバイトスト リーム(何の事やらさっぱり) $type = SOCK_STREAM; // 最大キュー数 $backlog = 5; // ソケットを作成する if (($sock = socket_create ($domain, $type, 0)) < 0) { echo "ソケットの作成に失敗しました。" . socket_strerror ($sock) . "\n"; } // ソケットに名前をバインドする if (($ret = socket_bind ($sock, $address, $port)) < 0) { echo "バインドに失敗しました。" . socket_strerror ($ret) . "\n"; } // ソケット上で接続をモニタする。 if (($ret = socket_listen ($sock, $backlog)) < 0) { echo "接続待ちに失敗しました。 " . socket_strerror ($ret) . "\n"; } // 接続に失敗するか、break 2 するまで繰り返し do { // ソケットへの接続を許可する。 if (($msgsock = socket_accept($sock)) < 0) { echo "接続許可に失敗しました。 " . socket_strerror ($msgsock) . "\n"; break; } // 出力する文字 $msg = "終わりたいときは'quit' サーバーを止めたい時は'shutdown'"; // クライアントへ文字の出力 socket_write($msgsock, $msg, strlen($msg)); // サーバーに文字の出力 echo "新しいお客さんが来ましたよ。\n"; // ワーハハハ、ずっと俺のターンだ! do { // ソケットから(最大2048バイトまでの)入力データを読込む if (FALSE === ($buf = socket_read ($msgsock, 2048))) { echo "データの読込みに失敗しました。" . socket_strerror ($ret) . "\n"; break 2; } // 空白除去して中身が空っぽだったら何もしない if (!$buf = trim ($buf)) { continue; } // quitだったらクライアントの終了(実際は1文字入力した瞬間反応するんだけど・・・) if ($buf == 'quit') { break; } // shoutdownだったらソケットサーバーの停止 if ($buf == 'shutdown') { // ソケットを切断する socket_close ($msgsock); break 2; } // 出力する文字 $talkback = "お前が打った文字は'$buf'だあああ\n"; // クライアントへ文字の出力 socket_write ($msgsock, $talkback, strlen ($talkback)); // サーバーに文字の出力 echo "お客さんが'$buf'って言ってますよ?\n"; } while (true); // ソケットを切断する socket_close ($msgsock); } while (true); // ソケットを閉じる socket_close ($sock); ?>
テストなんでwindowsで起動。(というかルーター変えてからLinuxの調子が・・・)
IPやパスやポートは適当に書き換えて。
socket_start.bat
@echo off echo ソケットサーバーを起動します。 c:\xampplite\php\php C:\xampplite\htdocs\vh\127.0.0.2\html\test\socket.php
socket_telnet.bat
telnet 192.168.24.66 10001
同時接続どうするんだろう?
多分続く。