【C/S通信交互之Http篇】使用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)  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的时候都有说过了,这里就不多说了; 

 










本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/969799,如需转载请自行联系原作者
目录
相关文章
|
机器学习/深度学习 存储 人工智能
MNN-LLM App:在手机上离线运行大模型,阿里巴巴开源基于 MNN-LLM 框架开发的手机 AI 助手应用
MNN-LLM App 是阿里巴巴基于 MNN-LLM 框架开发的 Android 应用,支持多模态交互、多种主流模型选择、离线运行及性能优化。
16103 81
MNN-LLM App:在手机上离线运行大模型,阿里巴巴开源基于 MNN-LLM 框架开发的手机 AI 助手应用
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
848 3
|
11月前
|
存储 API 数据库
自动发短信的软件,批量自动群发短信,手机号电话号生成器【python框架】
这个短信群发系统包含以下核心功能: 随机手机号生成器(支持中国号码) 批量短信发送功能(使用Twilio API)
|
运维 安全 网络安全
443端口:HTTPS通信的安全基石
作为互联网安全的基石,443端口通过加密与认证机制,保护了数十亿用户的隐私与数据完整性。无论是开发者、运维人员还是普通用户,理解其原理与作用都至关重要。在享受便利的同时,也需时刻关注安全实践,防范潜在风险。
4079 12
|
安全 搜索推荐 网络安全
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
657 11
|
监控 开发者 Perl
perl use HTTP::Server::Simple 轻量级 http server
使用 **HTTP::Server::Simple** 模块,Perl 开发者可以快速创建和配置一个轻量级的HTTP服务器。通过继承和扩展 `handle_request` 方法,可以实现复杂的请求处理逻辑。结合日志记录功能,可以更好地监控服务器运行情况。无论是用于开发测试还是简单的生产环境应用,这种轻量级解决方案都能提供很好的支持。
452 2
|
前端开发 JavaScript 中间件
前端全栈之路Deno篇(四):Deno2.0如何快速创建http一个 restfulapi/静态文件托管应用及oak框架介绍
Deno 是由 Node.js 创始人 Ryan Dahl 开发的新一代 JavaScript 和 TypeScript 运行时,旨在解决 Node.js 的设计缺陷,具备更强的安全性和内置的 TypeScript 支持。本文介绍了如何使用 Deno 内置的 `Deno.serve` 快速创建 HTTP 服务,并详细讲解了 Oak 框架的安装和使用方法,包括中间件、路由和静态文件服务等功能。Deno 和 Oak 的结合使得创建 RESTful API 变得高效且简便,非常适合快速开发和部署现代 Web 应用程序。
768 2
|
JSON Java fastjson
Java Http 接口对接太繁琐?试试 UniHttp 框架吧
UniHttp 是一个声明式的 HTTP 接口对接框架,旨在简化第三方 HTTP 接口的调用过程。通过注解配置,开发者可以像调用本地方法一样发起 HTTP 请求,无需关注请求的构建和响应处理细节。框架支持多种请求方式和参数类型,提供灵活的生命周期钩子以满足复杂的对接需求,适用于企业级项目的快速开发和维护。GitHub 地址:[UniAPI](https://github.com/burukeYou/UniAPI)。
|
存储 JSON Go
在Gin框架中优雅地处理HTTP请求体中的JSON数据
在Gin框架中优雅地处理HTTP请求体中的JSON数据
|
缓存 运维 Serverless
函数计算产品使用问题之怎么优化HTTP Server的启动速度
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。

热门文章

最新文章