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


    之前已经分享过一篇基于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)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    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类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    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) throwsServletException, 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,观察控制台:

    1
    2
    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 初始化函数替换如下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    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文件夹下)

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

    在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的时候都有说过了,这里就不多说了;

    http://blog.csdn.net/linking530/article/details/39401155

  • 相关阅读:
    用c#开发微信 (7) 微渠道
    Swift语言精要
    Android开发点滴
    UITableViewAutomaticDimension
    iOS中ActionSheet和Alert的区别
    本博客申明
    iOS中重用UITableView单元格时,千万别忘了这个
    Swift 2 语言精要
    Objective-C中NSString与int和float的相互转换
    Android Studio常用快捷键
  • 原文地址:https://www.cnblogs.com/findumars/p/7378497.html
Copyright © 2020-2023  润新知