ホームページ >バックエンド開発 >PHPチュートリアル >cocos2d-x ネットワークプログラミング PHP サーバーへの接続 メモ 4
このセクションでは、ダウンロードして学習できるように、記事の最後に最終的な実装コードとリソースを掲載します。
このセクションでは、cocos2d-x にバインドされたcurl ライブラリを使用します。これについては私自身しか知りませんが、非常に人気があると言われています。誰もが笑える基本的な使い方。さて、このライブラリを使いたい場合は、やはりプロジェクト内で設定する必要があります。例えばヘッダーファイルを先頭に #include "curl/curl.h" とインクルードする必要があります (公式の書き方)
この方法で記述するには、プロジェクトのプロパティ -> リンカー - 「追加ライブラリ」が必要です。curl パスをディレクトリに追加します。私と同じように混乱している場合は、次のようにすべて記述してください: #include "curl/include/win32/curl/curl.h"間違いなく大丈夫です
さらに、プロジェクトの [プロパティ] -> [リンカー] -> [入力] -> [追加の依存関係] に「libcurl_imp.lib」、「ws2_32.lib」、「wldap32.lib」を追加する必要があります。最初のものが最も重要なので追加する必要があります。最後の 2 つのオンライン ライブラリ チュートリアルでは追加する必要があると言っていますが、本当に必要かどうかはわかりません。
最後のセクションで、onBtnLoginClicked はログイン ボタンの応答コードです。行 txtUser->setString("click login btn") をコメント アウトし、以下のコードを記述します。詳細については、curl の基本的な使用法も確認できます。curl_easy_setopt を CURLOPT_URL: リクエスト URL、CURLOPT_WRITEFUNCTION: データ受信メソッド、および CURLOPT_WRITEDATA: を設定して、返されたデータを受け入れる文字列を格納する必要があります。このうち CURLOPT_WRITEFUNCTION は非常に重要であり、データが正常に受信されるかどうかを決定します。次に、すべての設定が完了したら、curl_easy_perform を実行してネットワーク要求を実行し、サーバーから応答データを取得します。これは、必要なログインが成功したかどうかを示します。
このcurl_easy_perform関数は大きな落とし穴であることに注意してください。curl_easy_performの実行時にどのようなエラーが発生しても、実行時に即座にクラッシュするため、ユーザーは混乱します。そしてデバッグできません。実際、ほとんどのエラーは上記のcurl_easy_setopt設定エラー、特にCURLOPT_WRITEFUNCTIONによって引き起こされます。データ受信メソッドに間違ったパラメータが含まれている可能性があり、ここでクラッシュします。
//0 获取用户名和密码 string strUser = txtUser->getString(); string strPass = txtPass->getString(); //1 curl初始化 CURL* curl = curl_easy_init(); if (curl) //如果初始化成功 { char url[1000] = {0}; //我们根据用户输入的用户名和密码拼出请求url sprintf(url, "http://127.0.0.1/testPhp/checkLogin02.php?uname=%s&upass=%s",strUser.c_str(), strPass.c_str()); int res; //2 网络连接初始化 res = curl_easy_setopt(curl, CURLOPT_URL, url); //设置要连接的网址, res返回0表示成功 //3 设定数据接收方法 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, processData); //4 设定数据接收变量 std::string recvbuf; curl_easy_setopt(curl, CURLOPT_WRITEDATA, &recvbuf); //5 发起联网请求 res = curl_easy_perform(curl); //6 处理结果,根据网络连接返回的结果实现跳转和提示 if (CURLE_OK == res) //CURLE_OK == 0 { if (recvbuf.compare("1")==0) //如果返回结果为1,即用户名和密码匹配上 { //保存用户的name //HelloWorld::setUname(strUser); //登录成功,跳转到游戏场景,这里GameScene就是诸位的正式游戏场景,我没实现,请见谅 //Director::getInstance()->replaceScene(GameScene::scene()); lblResult->setString("Login Success!"); } else //否则登录失败 { lblResult->setString("Login Failed!"); } } }関数のパラメータ形式は厳密に記述する必要があります。これによると、この関数を使用しないように注意してください。クラスとして記述されたメンバー関数は、クラスの内部関数としてのみ記述できます。そうしないと、この関数のパラメーター char* ptr が実行時にエラーが発生します。サーバーから返されたデータの最初のアドレス、size はデータ パケット内のおおよそのバイト数、nmemb はおおよそのデータ量を意味します。stream は、CURLOPT_WRITEDATA を設定するときに設定した受信データ文字列です。この関数の意味は非常に明確で、サーバーから返されたバイト数 (つまり、recvbuf) に従って char* ptr メモリのデータをストリームにコピーし、受信したデータを取得できるようにするだけです。サーバーによって
これが完了し、実行する準備が整いました。実行する前に忘れずにサーバーを開いてください。つまり、下の図のように phpStudy を実行し、Apache と mysql を起動します
念のため。ブラウザに URL を手動で入力することをお勧めします: http://127.0.0.1/testPhp/checkLogin02.php?uname=wang&upass=123
サーバーが正常かどうかを確認し、サーバーを役に立たないようにしてください。デバッグ後、結果はログインに失敗し、私はおかしくなりました -_-
さて、試してみましょう。これで UI インターフェイスにログインが成功したことが表示されるはずです。スクリーンショットは撮りません。
ソースコード + リソースファイル