【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)

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) 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,观察控制台:

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

时间: 2024-10-30 01:55:16

【C/S通信交互之HTTP篇】COCOS2DX(CLIENT)使用CURL与JETTY(SERVER)实现手机网游HTTP通信框架(内含解决CURL.H头文件找不到问题)的相关文章

【C/S通信交互之SOCKET篇】COCOS2DX(CLIENT)使用BSD SOCKET与MINA(SERVER)手机网游通信框架!

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/844.html 其实对于此篇算是对于这段时间网络研究的一个总结. 对于手游网络通信的交互,一般情况下,Socket长连接直接使用Mina框架即可,对于Http短连接使用Servlet 入口即可(那么对于后期将陆续更新Servlet博文) 那么本篇主要介绍Socket长连接,当然与此配对的跨平台通信则选择了BSD

cocos2d-x手机网游阶段流失诊断工具TuesdayData

Android手机网游阶段流失诊断工具--TuesdayData Client:C++ Server:Firefly 1.3.1 (python) DB:mysql 1.简介 本SDK是基于cocos2d-x游戏的稳定性以及阶段流失诊断的工具,具体可应用在网游从启动至游戏登陆之间,可将此期间的一切操作进行发送到服务器并存入服务器数据库,可从服务器方便的了解到程序在每个阶段出现问题的概率与部分用户流失的原因,并可针对某个阶段进行改良. 2.集成步骤 (1)导入PhoneNet.Java 将com文

android游戏-手机网游cocos2d-x开发内存问题

问题描述 手机网游cocos2d-x开发内存问题 网络开发 使用ODSocket的 在断网的时候 内存会一直往上涨 然后就退出了 请问这个可能的情况是什么啊

手机网游制造之网络通信篇

开发程序:疯狂的炸弹 开发进度:第二期 本期要点:设计客户端网络功能 开发平台:java平台 上期我们讲了客户端游戏功能,设计的程序只是一个单机游戏,为什么会这样呢?因为没有网络功能,无法进行通信.本期,我们就介绍客户端网络功能的设计. 客户端网络功能设计思路 客户端网络功能就是将客户端的操作转换为数据发送给服务器端,并将服务器端反馈的数据以界面的形式呈现给用户.如果把所有的逻辑处理都放在服务器端,当然是最安全的形式,但是这样服务器端的压力会比较大,所以一般会将一些简单的程序逻辑,例如本示例中移

手机网游制造之请求处理篇

开发程序:疯狂的炸弹 开发进度:第四期 本期要点:设计服务器端请求处理功能 开发平台:java平台 经过前面3期的讲解,我们的手机网游<疯狂的炸弹>大体已经完成,在加上上本期开发的请求处理功能,就OK啦.快来试试我们的<疯狂的炸弹>吧(游戏下载地址:http://www.shudoo.com/bzsoft). 既然是手机网游,自然客户端的数量就会比较多,所以多个客户端同时向服务器端发送请求的情况很常见.为了更好的运行,服务器端需要同时处理多个客户端的请求,这就是用到并发处理.下面就

手机网游制造之数据处理篇

开发程序:疯狂的炸弹 开发进度:第三期 本期要点:设计服务器端数据处理功能 开发平台:java平台 手机网游只有客户端是玩不起来的,必须要有服务器端.开发服务器端,最核心的就是设计服务器端的数据处理功能(完整的实例程序请到http://www.shudoo.com/bzsoft下载). 在一般的服务器端程序中,服务器端程序主要包含数据存储.程序逻辑控制和网络编程等部分,数据存储和程序逻辑控制结合的比较紧密,可以统称为数据处理.为了方便网络数据的传输和整个程序的维护,程序的服务器端最好跟客户端的开

手机网游制造之游戏界面篇

开发程序:疯狂的炸弹 开发进度:第一期 本期要点:设计客户端游戏功能 开发平台:java平台 从3G中受益的行业,一定少不了手机网游,手机网游应该怎么开发呢?跟PC平台上的游戏开发一样吗?别急,跟随我们开发一个手机网游,你就什么都明白了.本期我们先讲客户端的游戏功能. 手机网游前景光明 国内的手机网络游戏最早出现在2004年,最初由3人团队开发并运营的休闲网游--<移动玩家>系列.第一个公司开发的手机网游是<三界传说>.手机网游发展到如今已经有几十款手机网游上线运营了.易观Enfo

java socket手机通信-关于java的问题:手机用socket连接电脑的服务端时老出现文件找不到的错误,求解决

问题描述 关于java的问题:手机用socket连接电脑的服务端时老出现文件找不到的错误,求解决 30C 解决方案 也可以私聊我.扣扣1944687725 解决方案二: 解决方案三: 你那个斜杠是不是写反了 passwdinput.dat 解决方案四: 你仔细看看出错的提示, 是读文件的时候找不到,对应的代码是在ServerThread.java的51行然后,你把路径改为绝对路径试一试,如果可以了,就是你相对路径的根目录不对.保证passwd文件夹在你的执行目录下 解决方案五: 右键 prope

【COCOS2DX通信(HTTP&amp;SOCKET)相关编译到ANDROID细节总结】编译加入CURL关联LIB与头文件 &amp;&amp; 解决PTHREAD的CANCEL函数NDK不支持,找不到SOCKADDR_IN、HTONS等问题;

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/881.html 本篇介绍在Cocos2dx中加入网络通信相关代码,然后编译到Android时出现的一些细节和需要注意的地方总结.不多废话了,直接进入正题:    1.  首先介绍在Cocos2dx中使用pthread编译时应注意: 由于NDK明确指明不支持 pthread_cancel() 函数,编译的错误提示如下