设为首页 收藏本站
查看: 1682|回复: 0

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

[复制链接]

尚未签到

发表于 2017-2-27 11:08:07 | 显示全部楼层 |阅读模式

本站文章均为李华明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 



  • ServletServer.java  
  •    
  • import org.eclipse.jetty.server.Server;  
  • import org.eclipse.jetty.servlet.ServletContextHandler;  
  • import org.eclipse.jetty.servlet.ServletHolder;  
  •    
  • import servlet.HServlet;  
  •    
  • /** 
  •  * @author Himi 
  •  */  
  • public class ServletServer {  
  •     public static void main(String[] args) throws Exception {  
  •         Server server = new Server(8080);    
  •    
  •         ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);  
  •         context.setContextPath("/");    
  •    
  •         server.setHandler(context);    
  •    
  •         context.addServlet(new ServletHolder(new HServlet()), "/himi");    
  •    
  •         server.start();  
  •         server.join();  
  •     }  
  • }  

  


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



  • HServlet.java  
  •    
  • package servlet;  
  •    
  • import java.io.IOException;  
  •    
  • import javax.servlet.ServletException;  
  • import javax.servlet.http.HttpServlet;  
  • import javax.servlet.http.HttpServletRequest;  
  • import javax.servlet.http.HttpServletResponse;  
  •    
  • /** 
  •  * @author Himi 
  •  */  
  • public class HServlet extends HttpServlet {  
  •     private static final long serialVersionUID = 1L;    
  •    
  •     public HServlet() {  
  •     }    
  •    
  •     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  •         System.out.println("~~~~有一个Clinet访问!~~~~");  
  •    
  •         //获取http Client端对应的两个字段的数据  
  •         String name = request.getParameter("name");  
  •         String password = request.getParameter("password");  
  •         //设置字符编码  
  •         response.setCharacterEncoding("UTF-8");  
  •         response.setContentType("text/html");  
  •         response.setStatus(HttpServletResponse.SC_OK);  
  •         response.getWriter().println("Server say: 测试中文:session=" + request.getSession(true).getId());    
  •    
  •         if(name!=null) {  
  •             response.getWriter().println("Server say:名字:"+name);  
  •             System.out.println("Client say: name="+name);  
  •         }  
  •    
  •         if(password!=null) {  
  •             response.getWriter().println("Server say:密码:"+password);  
  •             System.out.println("Client say: password="+password);  
  •         }  
  •     }  
  • }  

  


 
 
我们的Servlet里,就是得到http clinet端传过来的数据返回回去。中间简单写给客户端一些简单字符串~
      OK,启动我们的Jetty服务器,右键ServletServer.java run,观察控制台:
 
[java] view plaincopy 



  • 2012-05-25 16:43:04.767:INFO:oejs.Server:jetty-8.1.3.v20120416  
  • 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 



  • bool HelloWorld::init()  
  • {  
  •    
  • /* 
  •  *@author By Himi 
  •  */  
  •    
  •     //////////////////////////////  
  •     // 1. super init first  
  •     if ( !CCLayer::init() )  
  •     {  
  •         return false;  
  •     }  
  •     CCLabelTTF* pLabel = CCLabelTTF::labelWithString("Hello World""Thonburi", 34);  
  •     CCSize size = CCDirector::sharedDirector()->getWinSize();  
  •     pLabel->setPosition( ccp(size.width / 2, size.height - 20) );  
  •     this->addChild(pLabel, 1);  
  •    
  •     CURL *curl;  
  •     CURLcode res;  
  •     char buffer[10];  
  •    
  •     curl = curl_easy_init();  
  •     if (curl)  
  •     {  
  • //        curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:8080/himi");  
  •         curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:8080/himi?name=xiaoming&password=李华明");  
  •         res = curl_easy_perform(curl);  
  •         /* always cleanup */  
  •         curl_easy_cleanup(curl);  
  •         if (res == 0)  
  •         {  
  •             pLabel->setString("0 response");  
  •         }  
  •         else  
  •         {  
  •             sprintf(buffer,"code: %i",res);  
  •             pLabel->setString(buffer);  
  •         }  
  •     }  
  •     else  
  •     {  
  •         pLabel->setString("no curl");  
  •     }   
  •    
  •     return true;  
  • }  

  


 
 
OK,然后我们导入 curl.h头文件:
1
#include "curl/curl.h"



还没完,这时候提示我们找不到这个头文件,OK,继续操作两步如下:
1.   加入 libcurl.a 文件:(此文件默认在cocos2dx引擎包下的cocos2dx/platform/third_party/ios/libraries文件夹下)
DSC0000.png
别着急这时候还会提示头文件找不到;
在xcode中点击你的cocos2dx项目,然后选择你项目的 targets,然后在Build Settings中找到 Search Paths:
双击你的 Library Search Paths 观察:如下图:
DSC0001.png
 
下面那个”$…../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这里的路径也截图给大家一张便于对比:
DSC0002.png
 
OK,如果以上步骤都操作正常那么编译将没有任何问题;
编译成功后,command+R运行项目,观察xcode控制台打印,以及服务器端打印:正常情况下应该如下:
DSC0003.png
 
OK,一切正常;
注意:用脚本新建的工程,默认是不加libcurl的,大家编译到其他平台的时候要修改makefile文件将其添加进去;(具体可以参考tests里面的makefile ) 
       提醒 :这里客户端与服务器只是简单的http交互,没有更细节的处理,例如 Client端访问应该另起一个线程,交互的时候数据要有一定的协议规范等等这些在介绍Socket的时候都有说过了,这里就不多说了; 
   

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-347894-1-1.html 上篇帖子: Eclipse+jetty+maven+Struts2+Spring2+Hibernate3+annotation注册系统V1.0 没有实现0配置(转) 下篇帖子: 【练习代码】试用百度BAE和练手jetty continuation的副成品 —— 一个简陋的WEB版LBS聊天应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表