c/s通信交互之http篇cocos2dx(client)使用curl与jetty(server)实现手机网游http通信框架(内含解决curl.h头文件找不到问题)

朝闻道 朝闻道     2022-09-15     254

关键词:

之前已经分享过一篇基于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 [email protected]: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模式

上一篇这里描写叙述了一个关于差异数据在开发过程中的一个长处,这里来演示另外一个特点:单机开发之无缝切换到C/S模式一般C/S模式都面临一个问题:就是开发过程中的调试难题,由于涉及到client和服务端相关方法,假设由某个人... 查看详情

源码分析mycat专栏

源码分析MyCAT1.6目录1、源码研究mycat之mysql通信协议篇之握手认证协议2、源码分析mycat1.6之mysql通信协议篇之COM_QUERY(SELECT语句报文解析)3、源码分析mycat1.6之mysql通信协议篇之存储过程调用4、源码研读Mycat1.6之网络篇---前端线程模... 查看详情

10cocos2dx3.0游戏开发找小三之容器篇:vectormapvalue

重开发人员的劳动成果。转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27705613容器3.0版本号之前Cocos2d-x引擎为我们提供了CCArray、CCDictionary等Objective-C风格的容器;使用Cocos2d-x容器的一个重要原因在于Cocos2d-... 查看详情

源码分析mycat专栏

源码分析MyCAT1.6目录1、源码研究mycat之mysql通信协议篇之握手认证协议2、源码分析mycat1.6之mysql通信协议篇之COM_QUERY(SELECT语句报文解析)3、源码分析mycat1.6之mysql通信协议篇之存储过程调用4、源码研读Mycat1.6之网络篇---前端线程模... 查看详情

java编程基础之网络编程(代码片段)

网络编程文章目录网络编程概述C/S和B/S网络通信协议网络编程要素IP类UDP协议数据传输发送端接收端udp数据传输丢失问题TCP概述Socket客户端ServerSocket服务端Socket**服务器代码**客户端代码文件上传实现客户端服务端多线程版概述C/S... 查看详情

?cocos2dx之如何优化内存使用(高级篇)

...杀死。为了减少内存警告,这里我们给出两个普遍的关于cocos2dx游戏内存优化的指导原则。1)了解瓶颈,然后解决掉什么样的纹理消耗了大部分应用的内存呢?或者说这些纹理消耗了多 查看详情

jenkins基础篇系列之-—10执行jenkinscli命令(代码片段)

...把Jenkins中的配置代码化.JenkinsCLi下载JenkinsCLI浏览器打开http://localhost:8080/cli/,点击查看关于CLI的wiki链接,下载jenkins-cli.jar(JENKINS_URL/jnlpJars/jenkins 查看详情

前端之html(代码片段)

前端1.什么是前端任何直接能够跟用户打交道的交互界面都可以称之为前端2.软件开发架构C/S架构B/S架构本质上B/S架构也是C/S架构3.浏览器输入网址,发生了几件事输入网址朝服务端发送get请求服务器接收请求并查询浏览器想要的... 查看详情

网页和服务器的交互需要用到socket吗

用到了,因为socket通信是计算机网络编程的基础,互联网上的通信离不开它。说详细一点,至少要明白HTML,socket编程,计算机网络的TCP/IP模型。1、TCP/IP是计算机通信的基础;2、socket通信本来是UNIX的基于服务器/客户端的TCP/IP实现... 查看详情

复习之网络编程

...表会传网数物应用层:http/ftp传输层:tcp,udp计算机之间的通信是某一个具体的应用程序与另外一个应用程序之间的通信端口port:唯一标识一台计算机某一个基于网络通信的应用程序标识的就是应用程序tcp面向流的协议,udp面向消息... 查看详情

进程通信之内存共享篇

  进程通信之_ 内存共享 概念:共享内存是被多个进程共享的一部分物理内存。共享内存是进程间的共享数最快的方法,一个进程向共享内存区域写入数据,共享这个内存区域的所有进程就可以写入数据,所有进... 查看详情

reactnative系列教程之十二reactnative(js/es)与ios(object-c)交互通信

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自【黑米GameDev街区】原文链接: http://www.himigame.com/react-native/2301.htmlwidth="150"height="210"frameborder="0"scrolling="no 查看详情

敏捷开发之理论概述篇

一、敏捷实践  1.敏捷宣言    个体与交互    胜过  过程和工具    可以工作的软件  胜过  面面俱到的文档    客户合作      胜过  合同谈判    响应变化      胜... 查看详情

万物互联之~rpc专栏(代码片段)

...t/6.rpc/3.1.概念RPC(RemoteProcedureCall):分布式系统常见的一种通信方法(远程过程调用),通俗讲:可以一台计算机的程序调用另一台计算机的子程序(可以把它看成之前我们说的进程间通信,只不过这一次的进程不在同一台PC上了... 查看详情

前端的ui设计与交互之图标篇

图标是具有指代意义的图形,也是一种标识。通过使用图标表达命令,强调状态,表示产品或类别。为了系统及跨平台之间图形认知保持一致,图标在设计和使用时有以下两个原则点需要注意:简单的图形语言以及高辨识度。清... 查看详情

[原创]分布式系统之缓存的微观应用经验谈交互场景篇

分布式系统之缓存的微观应用经验谈(四)【交互场景篇】  前言  近几个月一直在忙些琐事,几乎年后都没怎么闲过。忙忙碌碌中就进入了2018年的秋天了,不得不感叹时间总是如白驹过隙,也不知道收获了什么和失... 查看详情

http请求流程

...协议,是一种详细规定了浏览器和万维网服务器之间互相通信的规则,是万维网基础,它允许将HTML(超文本标记语言)文档从web服务器传送到web浏览器发起HTTP请求:在浏览器地址栏中输入一个URL,并回车借助工具发起HTTP请求:Linux系 查看详情

前端的ui设计与交互之导航篇

在广义上,任何告知用户他在哪里,他能去什么地方以及如何到达那里的方式,都可以称之为导航。当设计者使用导航或者自定义一些导航结构时,请注意:尽可能提供标识、上下文线索,避免用户迷路;保持导航样式和行为一... 查看详情