之前已经分享过一篇基于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/S通信交互之Http篇】Cocos2dx(Client)使用Curl与Jetty(Server)实现手机网游Http通信框架(内含解决curl.h头文件找不到问题)的更多相关文章

  1. Swift中不用桥接文件和.h头文件直接和C代码交互的方法

    我们知道一般情况下Swit要想调用obj-c,c或c++代码必须通过obj-c以及桥接文件才可以办到,但是对于某些简单的代码,我们可以跳过桥接文件和.h头文件,直接和C代码交互呢! 我们再Projec ...

  2. Qtl和JS、HTML通信/交互

    http://www.cnblogs.com/sigma0/p/7346727.html Qt的QWebChannel和JS.HTML通信/交互驱动百度地图 0 前言 我一个研究嵌入式的,不知道怎么就 ...

  3. Qt的QWebChannel和JS、HTML通信/交互驱动百度地图

    Qt的QWebChannel和JS.HTML通信/交互驱动百度地图 0 前言 我一个研究嵌入式的,不知道怎么就迷上了上位机,接了几个项目都是关于Qt,这个项目还是比较经典的,自己没事儿的时候也进行研究 ...

  4. 手把手教你Android手机与BLE终端通信--连接,发送和接收数据

    假设你还没有看上一篇 手把手教你Android手机与BLE终端通信--搜索,你就先看看吧,由于这一篇要接着讲搜索到蓝牙后的连接.和连接后的发送和接收数据. 评论里有非常多人问假设一条信息特别长,怎么不 ...

  5. Android BLE开发——Android手机与BLE终端通信初识

    蓝牙BLE官方Demo下载地址:   http://download.csdn.net/detail/lqw770737185/8116019参考博客地址:    http://www.eoeandr ...

  6. 小猪猪逆袭成博士之C++基础篇(二) 常量、处理类型、自定义头文件

    小猪猪逆袭成博士之C++基础篇(二) const .auto. decltype 上一章我们介绍了一些常用的类型和常见的问题,下面再介绍一些学习的时候不是特别常用但是在实际工程中很有用的一些东西. 一 ...

  7. CLion之C++框架篇-优化开源框架,引入curl,实现get方式获取资源(四)

      背景   结合上一篇CLion之C++框架篇-优化框架,引入boost(三),继续进行框架优化!在项目中,我们经常会通过get方式拉取第三方资源,这一版优化引入类库curl,用来拉取第三方资源库. ...

  8. Android中使用开源框架EventBus3.0实现Fragment之间的通信交互

    1.概述 在之前的博文中简单介绍过如何实现fragment之间的信息交互:<Android中Fragment与Activity之间的交互(两种实现方式)>,今天继续给大家介绍一种可以实现此 ...

  9. 总想自己动动手系列·2·本地和外网(Liunx服务器上部署的web项目)按照自定义的报文格式进行交互(完结篇)

    一.准备工作 (1)创建一个web-project工程,部署本地可正常访问,部署在云服务上可访问. (2)理解如何在web.xml文件中配置过滤器,和创建一个自定义的过滤器. (3)懂得如何打war包 ...

随机推荐

  1. iOS开发:枚举的介绍与使用

    #import "ViewController.h" //第一种写法 typedef enum { XMGDemoTypeTop, XMGDemoTypeBottom, }XMGD ...

  2. Windows Phone 8.1 Tiles, Notifications and Action Center

    (1)Tiles Tiles 也就是磁贴,是 Windows Phone 的一大特色. 一个 Tile 其实可以看成是一个 XML,比如: <tile> <visual> &l ...

  3. linux 系统升级中的一些配置

    1. 关闭IPV6 vi /etc/sysconfig/network NETWORKING_IPV6=no    #掉 source /etc/sysconfig/network vi /etc/m ...

  4. HTML Email 编写指南(转)

      作者: 阮一峰 日期: 2013年6月16日 今天,我想写一个"低技术"问题. 话说我订阅了不少了新闻邮件(Newsletter),比如JavaScript Weekly.每周 ...

  5. Uncaught SyntaxError: Unexpected end of input 解决办法

    Unexpected end of input  的英文意思是"意外的终止输入" 他通常表示我们浏览器在读取我们的js代码时,碰到了不可预知的错误,导致浏览器 无语进行下面的读取 ...

  6. 剑指Offer面试题10(Java版):二进制中的1的个数

    题目:请实现一个函数,输入一个整数.输出该数二进制表示中1的个数. 比如把9表示成二进制是1001,有2位是1.因此假设输入9.该函数输出2. 1.可能引起死循环的解法 这是一道非常主要的考察二进制和 ...

  7. 新技能 get —— Python 断点续传下载文件

    from urllib.request import urlretrieve import sys import os prev_reported_download_percent = None # ...

  8. erlang 游戏服务器开发

    http://blog.csdn.net/slmeng2002/article/details/5532771 最近关注erlang游戏服务器开发  erlang大牛写的游戏服务器值得参考 介绍本文以 ...

  9. 小强的HTML5移动开发之路(37)——jqMobi快速入门

    在<小强的HTML5移动开发之路(33)-- jqMobi基础>中我们了解了什么是jqMobi,并从官方下载了jqMobi开发包,下载后解压目录如下: 拷贝上面的/css目录./plugi ...

  10. Browser security standards via access control

    A computing system is operable to contain a security module within an operating system. This securit ...