`
shuai1234
  • 浏览: 978084 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

【C/S通信交互之Http篇】Cocos2dx(Client)使用Curl与Jetty(Server)实现手机网游Http通信框架(内含解决curl.h头文件

 
阅读更多


本站文章均为 李华明Himi 原创,转载务必在明显处注明:
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2dx/870.html

          ☞ 点击订阅 ☜
 本博客最新动态!及时将最新博文通知您!

 

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

【C/S通信交互之Socket篇】Cocos2dx(Client)使用BSD Socket与Mina(Server)手机网游通信框架!

那么今天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 plaincopy
 
  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.         Server server = new Server(8080);    
  15.    
  16.         ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);  
  17.         context.setContextPath("/");    
  18.    
  19.         server.setHandler(context);    
  20.    
  21.         context.addServlet(new ServletHolder(new HServlet()), "/himi");    
  22.    
  23.         server.start();  
  24.         server.join();  
  25.     }  
  26. }  



 

 

然后是我们的一个Servlet类:

 

[java] view plaincopy
 
  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.         System.out.println("~~~~有一个Clinet访问!~~~~");  
  23.    
  24.         //获取http Client端对应的两个字段的数据  
  25.         String name = request.getParameter("name");  
  26.         String password = request.getParameter("password");  
  27.         //设置字符编码  
  28.         response.setCharacterEncoding("UTF-8");  
  29.         response.setContentType("text/html");  
  30.         response.setStatus(HttpServletResponse.SC_OK);  
  31.         response.getWriter().println("Server say: 测试中文:session=" + request.getSession(true).getId());    
  32.    
  33.         if(name!=null) {  
  34.             response.getWriter().println("Server say:名字:"+name);  
  35.             System.out.println("Client say: name="+name);  
  36.         }  
  37.    
  38.         if(password!=null) {  
  39.             response.getWriter().println("Server say:密码:"+password);  
  40.             System.out.println("Client say: password="+password);  
  41.         }  
  42.     }  
  43. }  



 

 

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

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

 

[java] view plaincopy
 
  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 plaincopy
 
  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.     CCLabelTTF* pLabel = CCLabelTTF::labelWithString("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.         curl_easy_setopt(curl, CURLOPT_URL, "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.             pLabel->setString("0 response");  
  34.         }  
  35.         else  
  36.         {  
  37.             sprintf(buffer,"code: %i",res);  
  38.             pLabel->setString(buffer);  
  39.         }  
  40.     }  
  41.     else  
  42.     {  
  43.         pLabel->setString("no curl");  
  44.     }   
  45.    
  46.     return true;  
  47. }  



 

 

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

1
#include "curl/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的时候都有说过了,这里就不多说了; 

 

分享到:
评论

相关推荐

    cocos2dx3.x游戏开发之旅电子版

    9. **网络通信**:游戏往往需要与服务器交互,Cocos2dx提供了网络模块,支持HTTP、TCP/IP等协议,帮助你实现实时数据交换和更新。 10. **性能优化**:学习如何通过合理的内存管理和多线程技术提高游戏性能,以及...

    cocos2dx斗地主服务端,客户端在我的资源列表中

    【标题】"Cocos2dx斗地主服务端与客户端详解" 在游戏开发领域,Cocos2dx是一款...通过对这些代码的分析和学习,开发者可以掌握网络游戏的设计原理,加深对Cocos2dx引擎的理解,以及如何构建一个跨平台的斗地主游戏。

    cocos2dx3.x使用socket创建服务端和客户端

    《Cocos2dx3.x中Socket的运用:构建服务端与客户端》 ...总的来说,Cocos2dx3.x的Socket功能为开发者提供了构建网络通信的能力,但使用时需谨慎处理网络异常、并发控制等问题,以确保游戏的稳定性和用户体验。

    Cocos2d-3.10 使用Curl异步下载文件(断点续传)

    在Cocos2d-x游戏引擎中,Curl库是一个强大的工具,用于实现网络通信,特别是进行异步文件下载。在3.10版本中,Cocos2d-x提供了对Curl的支持,允许开发者在游戏运行时后台下载资源,提高用户体验,并且支持断点续传...

    cocos2dx 工具之CocosBuilder

    Cocos2dx是一个广泛使用的开源游戏开发框架,基于C++,支持跨平台的游戏开发,适用于iOS、Android、Windows等多个平台。在Cocos2dx的生态系统中,有一系列强大的辅助工具,大大提升了开发效率,其中CocosBuilder就是...

    cocos2dx-2.x播放mp4

    Cocos2dx是一个基于C++的游戏开发框架,它提供了丰富的功能来帮助开发者创建2D和3D游戏。在这个场景中,我们将深入探讨如何在Cocos2dx 2.x中实现MP4视频的播放。 首先,Cocos2dx 2.x自身并不直接支持MP4格式的视频...

    COCOS2DX实现线程后台运作与推送

    在iOS开发中,COCOS2DX是一款广泛使用的2D游戏开发框架,它基于C++,为开发者提供了高效的游戏开发工具。本主题聚焦于如何利用COCOS2DX实现线程后台运作以及推送通知功能,特别是在用户按下HOME键后进入后台模式时。...

    Cocos2dx中UIWebView替换为WKWebView

    在iOS开发中,Cocos2dx是一个广泛使用的游戏开发框架,它允许开发者创建跨平台的2D和3D游戏。然而,随着Apple对App Store审核政策的调整,使用UIWebView的App将不再被接受,因为Apple已经将其列为弃用API。在2020年...

    cocos2dx 游戏开发系列之三 源码

    《cocos2dx游戏开发系列之三:源码解析与Android工程构建》 在游戏开发领域,cocos2dx是一个广泛使用的开源游戏引擎,尤其在跨平台开发中扮演着重要角色。本篇将深入探讨cocos2dx游戏开发系列的第三部分——源码...

    基于cocos2dx的一个小例子

    总的来说,"基于cocos2dx的一个小例子"是一个很好的学习资源,它揭示了Cocos2dx游戏开发的基本流程和关键技术,对于初学者而言,通过这个实例可以深入理解和掌握Cocos2dx框架,为进一步的游戏开发打下坚实基础。

    cocos2dx 3.x 水波纹

    在本文中,我们将深入探讨如何在Cocos2d-x 3.x框架中实现水波纹效果,这是一种在游戏和图形应用中常见的动态视觉特效。Cocos2d-x是一个开源的游戏开发框架,支持多种编程语言,包括C++,并且在3.x版本中引入了许多...

    cocos2dx教程

    Cocos2DX是一款开源的游戏开发框架,主要用于创建2D和3D游戏,它基于C++,同时提供了Python、Lua等多种脚本语言接口。这个压缩包包含三本关于Cocos2DX的重要教程,分别是《Cocos2D-x权威指南》、《Cocos2d-x高级开发...

    cocos2dx 2048

    《cocos2dx 2048:游戏开发与cocos2dx框架解析》 “cocos2dx 2048”是一个基于cocos2dx框架开发的流行数字拼图游戏,它仿照了2048游戏的玩法,通过编程技术将2D图形、动画和逻辑控制融合在一起,为玩家提供了趣味且...

    基于Cocos2dx实现的卡牌游戏_放开那三国

    《基于Cocos2dx实现的卡牌游戏:深入解析“放开那三国”》 在游戏开发领域,Cocos2dx是一款广泛使用的开源游戏引擎,它以其高效、跨平台的特性深受开发者喜爱。本项目“放开那三国”便充分利用了Cocos2dx的强大功能...

    Game cocos2dx-C++

    对于网络游戏或需要在线数据的游戏,Cocos2dx提供了网络API,支持HTTP请求、WebSocket通信等。同时,游戏数据的本地存储可以通过SQLite数据库或者JSON文件来实现。 8. **性能优化** 了解内存管理、渲染优化、多...

    android项目中嵌入cocos2dx项目demo

    - 通过JNI(Java Native Interface)技术,Cocos2dx可以与Android的Java层进行通信,实现原生功能的调用。 2. **创建Cocos2dx项目** - 使用Cocos2dx命令行工具创建一个新的项目,如`cocos new HelloWorld -p ...

    cocos2dx下可用的,验证文件MD5代码及使用方法

    在Cocos2dx游戏开发中,确保资源文件的完整性和安全性是至关重要的。为了达到这一目标,开发者可以采用校验和或哈希函数,如MD5(Message-Digest Algorithm 5),来验证文件是否被篡改。MD5是一种广泛使用的加密散列...

    Cocos2DX源码

    Cocos2DX是一款开源的游戏开发框架,主要用于创建2D和3D游戏,它基于C++,并且支持多种平台,包括iOS、Android、Windows、Mac、Linux等。Cocos2DX的核心理念是提供一个高效、易用且功能强大的工具集,让开发者能够...

    cocos2dx 2.x 开发 示例游戏合集_C++_代码_下载

    cocos2dx 2.x 开发示例游戏合集 效果展示: https://github.com/pdpdds/cocos2dx-dev/blob/master/img/snap0215.jpg https://github.com/pdpdds/cocos2dx-dev/blob/master/img/snap0216.jpg ...

    Cocos2dx开源游戏-光线迷宫

    《Cocos2dx开源游戏-光线迷宫》是一款基于Cocos2dx游戏引擎开发的迷宫探索类游戏,它借鉴了iOS平台上的类似玩法,为玩家带来富有挑战性的游戏体验。Cocos2dx是一个广受欢迎的开源游戏开发框架,以其高效、易用和跨...

Global site tag (gtag.js) - Google Analytics