之前已经分享过一篇基于Cocos2dx与服务器使用Socket进行通信的框架,还不太熟悉的请移步到如下博文中:


那么今天Himi来分享如何在cocos2dx中使用Http来访问Server端并且获取数据;

这里对于Server端,Himi选用,Jetty,对于Jetty不太熟悉的可以先自行baidu~google~是个servlet的容器。类似JSP。 什么是servlet?jsp? = =。不赘述了。大家手动好吧;

下面我们简单书写一个Server端(如何创建一个Jetty服务器请看Himi  Jetty 开发系列文章)

———–首先服务器端————–

这里就ibu写创建项目和配置项目的jar包 build path了。直接上主要代码段:

       首先是Jetty  Server主类:(这里Himi用的IDE 是 Eclipse)

 


 

[java]  
    view plain 
    copy 
    

        
    
 
  
1. ServletServer.java  
2.    
3. import org.eclipse.jetty.server.Server;  
4. import org.eclipse.jetty.servlet.ServletContextHandler;  
5. import org.eclipse.jetty.servlet.ServletHolder;  
6.    
7. import servlet.HServlet;  
8.    
9. /**
10.  * @author Himi
11.  */  
12. public class ServletServer {  
13. public static void main(String[] args) throws Exception {  
14. new Server(8080);    
15.    
16. new ServletContextHandler(ServletContextHandler.SESSIONS);  
17. "/");    
18.    
19.         server.setHandler(context);    
20.    
21. new ServletHolder(new HServlet()), "/himi");    
22.    
23.         server.start();  
24.         server.join();  
25.     }  
26. }  
 
 

 
 
 

     
 
 
 
然后是我们的一个Servlet类:
 
 
 
 
    [java]  
    view plain 
    copy 
    

        
    
 
  
1. HServlet.java  
2.    
3. package servlet;  
4.    
5. import java.io.IOException;  
6.    
7. import javax.servlet.ServletException;  
8. import javax.servlet.http.HttpServlet;  
9. import javax.servlet.http.HttpServletRequest;  
10. import javax.servlet.http.HttpServletResponse;  
11.    
12. /**
13.  * @author Himi
14.  */  
15. public class HServlet extends HttpServlet {  
16. private static final long serialVersionUID = 1L;    
17.    
18. public HServlet() {  
19.     }    
20.    
21. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
22. "~~~~有一个Clinet访问!~~~~");  
23.    
24. //获取http Client端对应的两个字段的数据  
25. "name");  
26. "password");  
27. //设置字符编码  
28. "UTF-8");  
29. "text/html");  
30.         response.setStatus(HttpServletResponse.SC_OK);  
31. "Server say: 测试中文:session=" + request.getSession(true).getId());    
32.    
33. if(name!=null) {  
34. "Server say:名字:"+name);  
35. "Client say: name="+name);  
36.         }  
37.    
38. if(password!=null) {  
39. "Server say:密码:"+password);  
40. "Client say: password="+password);  
41.         }  
42.     }  
43. }



 



我们的Servlet里,就是得到http clinet端传过来的数据返回回去。中间简单写给客户端一些简单字符串~

      OK,启动我们的Jetty服务器,右键ServletServer.java run,观察控制台:

 



[java]  
    view plain 
    copy 
    

        
    
 
  
1. 2012-05-25 16:43:04.767:INFO:oejs.Server:jetty-8.1.3.v20120416  
2. 2012-05-25 16:43:05.110:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080




 

出现如上,表示你的Jetty Server启动成功;OK。然后设计客户端代码;

 

———–然后cocos2dx Clinet端————–

首先新建一个cocos2dx项目,这个不多说。然后在默认的HelloWorldScene.cpp 初始化函数替换如下代码:

 

[cpp]  
    view plain 
    copy 
    

        
    
 
  
1. bool HelloWorld::init()  
2. {  
3.    
4. /*
5.  *@author By Himi
6.  */  
7.    
8. //  
9. // 1. super init first  
10. if ( !CCLayer::init() )  
11.     {  
12. return false;  
13.     }  
14. "Hello World", "Thonburi", 34);  
15.     CCSize size = CCDirector::sharedDirector()->getWinSize();  
16.     pLabel->setPosition( ccp(size.width / 2, size.height - 20) );  
17. this->addChild(pLabel, 1);  
18.    
19.     CURL *curl;  
20.     CURLcode res;  
21. char buffer[10];  
22.    
23.     curl = curl_easy_init();  
24. if (curl)  
25.     {  
26. //        curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:8080/himi");  
27. "http://127.0.0.1:8080/himi?name=xiaoming&password=李华明");  
28.         res = curl_easy_perform(curl);  
29. /* always cleanup */  
30.         curl_easy_cleanup(curl);  
31. if (res == 0)  
32.         {  
33. "0 response");  
34.         }  
35. else  
36.         {  
37. "code: %i",res);  
38.             pLabel->setString(buffer);  
39.         }  
40.     }  
41. else  
42.     {  
43. "no curl");  
44.     }   
45.    
46. return true;  
47. }



 



 



OK,然后我们导入 curl.h头文件:




还没完,这时候提示我们找不到这个头文件,OK,继续操作两步如下:

1.   加入 libcurl.a 文件:(此文件默认在cocos2dx引擎包下的cocos2dx/platform/third_party/ios/libraries文件夹下)

别着急这时候还会提示头文件找不到;

在xcode中点击你的cocos2dx项目,然后选择你项目的 targets,然后在Build Settings中找到 Search Paths:

双击你的 Library Search Paths 观察:如下图:

 

下面那个”$…../third_party/ios/libraries”路径是你第一步添加lib curl.a的时候默认添加的。这个我们不要修改;但是请双击这个路径然后copy下来;

我们需要修改的是此属性的上一个属性,Header Search Paths;

双击Header Search Paths属性后面的连接,然后点击“+”号添加一个路径,这个路径就是刚才你copy的路径,但是粘贴后还要将此路径设置到上一个文件夹的路径;这么说有点绕,其实就是如下:

假设你之前copy的路径是  ”$…../third_party/ios/libraries”

   那么你在这里粘贴的时候路径应该是: ”$…../third_party/ios”

OK,Himi这里的路径也截图给大家一张便于对比:

 

OK,如果以上步骤都操作正常那么编译将没有任何问题;

编译成功后,command+R运行项目,观察xcode控制台打印,以及服务器端打印:正常情况下应该如下:

 

OK,一切正常;

       注意:用脚本新建的工程,默认是不加libcurl的,大家编译到其他平台的时候要修改makefile文件将其添加进去;(具体可以参考tests里面的makefile ) 

       提醒 :这里客户端与服务器只是简单的http交互,没有更细节的处理,例如 Client端访问应该另起一个线程,交互的时候数据要有一定的协议规范等等这些在介绍Socket的时候都有说过了,这里就不多说了;