cocos2d-x网络编程 连接php服务器笔记4

VS工程部分----网络编程

本节会把最终实现代码和资源放在文章最未提供各位下载学习。

本节我们开始重头戏联网功能的开发,我用的是cocos2d-x绑定的curl库,这个curl据说很火,虽然我本人了解的不多只晓得基本用法,让大家见笑了。好了想用这个库还是要在工程里设置下的,如开头要包含头文件 #include "curl/curl.h" (官方写法)

这样写需要工程属性 -> 链接器-》附加库目录里加上curl路径,假如你跟我一样觉不明所以干脆写全:#include "curl/include/win32/curl/curl.h"这样一定没问题

此外还要包含下curl的lib,在工程属性 -> 链接器->输入->附加依赖项加上“libcurl_imp.lib”,“ws2_32.lib”,“wldap32.lib”  第一个最重要一定要加,后两个lib网上教程说要加不知道是不是真的需要。

开始正式工作了,在上节onBtnLoginClicked 就是登录按钮响应代码里,把txtUser->setString("click login btn");这一行注掉,在下面写这样的代码:

        //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!");
				}

			}
		}

注释的很详细,大家也能看出curl的基本用法,需要curl_easy_setopt设置下CURLOPT_URL:请求网址, 设置CURLOPT_WRITEFUNCTION:数据接收的方法,还有CURLOPT_WRITEDATA:用于存放接受返回数据的字符串。其中CURLOPT_WRITEFUNCTION非常重要,决定了接收数据成功与否是什么。然后一切设定好后执行curl_easy_perform就可以执行网络请求,并得到服务器发来的响应数据,就是我们想要的登录是否成功。

注意这个curl_easy_perform函数是个大坑,curl库这里错误处理写的很不友好,不论出什么错执行到curl_easy_perform都是瞬间运行时崩溃,没任何assert出错提示,让用户莫名其妙,无法调试。其实错误大多是上面curl_easy_setopt设置错误,特别是CURLOPT_WRITEFUNCTION,数据接收方法可能参数错了这里就会崩溃,我把那个processData函数贴出来:

size_t processData(char *ptr, std::size_t size, std::size_t nmemb, std::string *stream)
{
	//char* ptr就是返回的服务器数据,服务器echo 1,这里就返回"1"
	log("正在写入数据");
	if (stream == NULL)
	{
		return 0;
	}
	size_t sizes = size * nmemb;
	//string* ss = (string *)stream;
	stream->append(ptr, sizes);
	return sizes;
}

函数参数格式要严格照此书写,注意不能把此函数写成类的成员函数,只能写成类内部函数,否则执行curl_easy_perform铁定出错,此函数参数char* ptr是服务器传回的数据首地址,size大概是一个数据包多少字节,nmemb大概是有多少数据包意思,stream就是我们在设置CURLOPT_WRITEDATA时设置的接收数据字符串recvbuf,这样一来函数意思也就很明白了,无非就是根据服务器返回的字节多少把char* ptr内存的数据拷到stream,就是recvbuf里去,这样我们就得到了服务器返回的接收数据

好了大功告成,可以运行了,运行前一定记得把服务器打开,就是运行phpStudy,启动apache和mysql,像下图这样

以防万一建议还是在浏览器里手动输入网址:  http://127.0.0.1/testPhp/checkLogin02.php?uname=wang&upass=123

看下服务器是否正常,别搞得服务器都没开就调试,结果就是登录失败而抓狂-_-

好了,大家试验下吧,这样应该在UI界面显示登录成功了,截图我也不截了。

源代码+资源文件

时间: 2024-07-29 07:00:58

cocos2d-x网络编程 连接php服务器笔记4的相关文章

cocos2d-x网络编程 连接php服务器笔记1

学习cocos2d-x网络编程是一个非常尴尬的问题,因为熟悉cocos2d-x的学习者基本在游戏开发一块属于客户端编程,想自学网络编程必不可少的牵扯到服务器这块.但是问题是,谁会呢?离开服务器,那搞网络编程无疑就是海市蜃楼镜花水月.官网示例虽然有http短连接和socket长连接的例子但反正我看了之后不知所以,不明白怎么把它用在实际问题中.网上教程也大都是泛泛而谈,不是一些人尽皆知的大道理就是部分不能运行的源码,根本就没有从零教你怎么实现的文章.手游服务器用的技术我们不大可能很了解,据说长连接的

cocos2d-x网络编程 连接php服务器笔记3

上节服务器部分已经开发完,本节开始客户端部分开发,首先是UI制作. UI制作 既然是登录验证那当然要有登录界面,UI起码也要像个游戏样子吧这里我不想用基本控件,就用cocostudio制作一个吧,cocostudio里有一个标准的登录界面如下: 为了图省事我用最新版的Cocos制作的(v2.2.8)当然你直接用cocostudio1.6导出json文件也可以,但是没有这样方便.如果你第一次使用,想用它来建立VS2012的 C++工程需要先在商店里下载一个Cocos Framework v3.6.

cocos2d-x网络编程 连接php服务器笔记2

好了环境也搭建好了工具也有了那我们就开始写php程序吧,上节我们说了我们设置网站的本机目录为d:/phpWWW,你在里面新建个testPhp目录,名字随便起,就表示这次你的作业存放位置,但一定要是英文的.对了,还没有数据库,第一步当然是建立自己的服务器数据库啦. 1. 数据库搭建 在phpStudy的MySQL管理器里我们点击MySQL-Front,打开mySql前端工具,出现一个如下图"打开登录信息..."对话框,直接点击打开按钮进入 进去之后界面还是很清楚的,左侧是树结构显示你现有

java网络编程socket\server\TCP笔记(转)

java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅 1 TCP的开销 a  连接协商三次握手,c->syn->s,s->syn ack->c, c->ack->s b  关闭协商四次握手,c->fin->s, s->ack-c,s->fin->c,c->ack->s c  保持数据有序,响应确认等计算开销 d

网络编程 --- URLConnection --- 读取服务器的数据 --- java

使用URLConnection类获取服务器的数据 抽象类URLConnection表示一个指向指定URL资源的活动连接,它是java协议处理器机制的一部分. URL对象的openConnection()方法就是调用了URLStreamHandler的openConnection()方法. 如有疑问请参考:JAVA网络编程[第三版], 如下图: 怎样获取服务器输出的数据呢?代码如下: import java.io.IOException; import java.io.InputStream; i

Linux网络编程:客户端/服务器的简单实现

一. Socket的基本知识 1. socket功能 Socket层次 Socket实质上提供了进程通信的端点,进程通信之前,双方必须首先各自创建一个端点,否则是没有办法建立联系并相互通信的. 每一个Socket都一个半相关描述: {协议, 本地地址, 本地端口} 完整的Socket的描述: {协议, 本地地址, 本地端口, 远程地址, 远程端口} 2. Socket工作流程 面向连接(TCP)的Socket工作流程 UDP的socket工作流程 l 服务器端 首先,服务器应用程序用系统调用so

Socket网络编程--简单Web服务器(1)

这一次的Socket系列准备讲Web服务器.就是编写一个简单的Web服务器,具体怎么做呢?我也不是很清楚流程,所以我找来了一个开源的小的Web服务器--tinyhttpd.这个服务器才500多行的代码,使用C语言.这一小节就不讲别的内容了.就对这个程序进行一些注释和讲解了. 主函数: 1 int main(void) 2 { 3 int server_sock = -1; 4 u_short port = 0; 5 int client_sock = -1; 6 struct sockaddr_

Socket网络编程--简单Web服务器(6)

本来是想实现ssl连接的,但是弄了好久都不成功,就索性不做了,等以后有能力再做了.所以这一小节就是本次的最后一节了.就简单的说几个注意点. 1.加个配置文件 使用单例模式,使用一个类,该类保存一些信息,例如一个配置类的一个属性为PAGE404的字符串,该字符串保存一个文件地址,然后我们的Page_404函数就可以用access判断PAGE404这个字符串对应的文件是否存在,如果存在那么如果是404页面那么就cat这个文件,而不是默认的404函数里面的页面.还有个端口什么的都是通过一个类似宏定义一

Linux网络编程——tcp并发服务器(poll实现)

想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程--I/O复用之poll函数> 代码: #include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/select.h> #include <sys/time.h> #include <sys/socket.h> #incl