转载自【黑米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
(
)
-
&
gt
;
getWinSize
(
)
;
pLabel
-
&
gt
;
setPosition
(
ccp
(
size
.
width
/
2
,
size
.
height
-
20
)
)
;
this
-
&
gt
;
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
-
&
gt
;
setString
(
"0 response"
)
;
}
else
{
sprintf
(
buffer
,
"code: %i"
,
res
)
;
pLabel
-
&
gt
;
setString
(
buffer
)
;
}
}
else
{
pLabel
-
&
gt
;
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的时候都有说过了,这里就不多说了;