`
shuai1234
  • 浏览: 972373 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

【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 Socket,当然还有其他的,这里只说BSD Socket;

对于BSD Socket不是很熟悉的请自行google学习下,Himi需要提醒大家的是BSD Socket不是第三方类库,而是UNIX/Linux系统中通用的网络接口;

首先连接到Server端,这里Himi简单封装一个函数提供大家使用;

     导入   #include <netdb.h>

两个参数:1:IP地址  2:端口

其中有个socket成员变量:

int socketHandle = 0;

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
int HSocket::connect(const char* ip, unsigned short port){ 
 
    struct sockaddr_in sa;
    struct hostent* hp;
 
    hp = gethostbyname(ip);
    if(!hp){
        return -1;
    }
    memset(&sa, 0, sizeof(sa));
    memcpy((char*)&sa.sin_addr, hp->h_addr, hp->h_length);
    sa.sin_family = hp->h_addrtype;
    sa.sin_port = htons(port);
 
    socketHandle = socket(sa.sin_family, SOCK_STREAM, 0);
 
    if(socketHandle < 0){
        printf( "failed to create socket\n" );
        return -1;
    }
    if(::connect(socketHandle, (sockaddr*)&sa, sizeof(sa)) < 0){
        printf( "failed to connect socket\n" );
        ::close(socketHandle);
        return -1;
    }
 
    CCLOG("Client connect OK ! IP: %s:%d ",ip,port);
    return 0;
}

两点注意:

1. 对于bsd socket 的  ::connect()函数进行连接服务器的时候会阻塞你的主线程,所以将Himi封装好的connect()函数在另一个线程调用则是一个好的处理方式;否则一旦网络比较差,你的游戏就假死ing~ 悲剧;

    2. 对于线程我们直接使用 pThread 就可以了,那么这里Himi就给一个创建线程的例子吧:

定义一个线程成员变量:

pthread_t threadHimi;

然后Himi也为大家封装一个函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int HSocket::threadStart(){
    int errCode = 0;
    do{
        pthread_attr_t tAttr;
        errCode = pthread_attr_init(&tAttr);
 
        CC_BREAK_IF(errCode!=0)
 
        errCode = pthread_attr_setdetachstate(&tAttr, PTHREAD_CREATE_DETACHED);
 
        if (errCode!=0) {
            pthread_attr_destroy(&tAttr);
            break;
        }
 
        errCode = pthread_create(&threadHimi, &tAttr, thread_function, this);
 
    }while (0);
    return errCode;
}

1)创建线程其实就是pthread_create()函数,但是上面这个函数其他内容则主要为你创建的线程设定为分离式;这里 thread_function 是个函数童鞋们对于pthread不太熟悉的请自行百度和google;

2)当然这里Himi要提醒大家,pthread是c库,不是c++库,它要求是全局函数,所以得static的!

那么连接到Server端之后我们就应该关心, BSD Socket  对于数据的发送和接收!

1.发送: send 函数:

           send(socketHandle,buffer,length,0)

socketHandle :  你已经连接的socket

buffer:发送的缓存数据

length:数据长度

2. 接收: recv 函数:

           recv(socketHandle, p, length, 0)

socketHandle  :  你已经连接的socket

p : 存放数据的容器

length:获取服务器数据的长度;

 注意:          

      1. 对于recv 函数的其中参数 length长度,大家务必要仔细,很清楚服务器应该发来的数据长度,因为一旦recv函数执行,那么不从Server端读取出length长度就不会罢休的!

     2.  如果你的Server端是Java的,那么要注意大端 ,小端的问题!Java属于大端模式,c++属于小端模式;(对于大小端不熟悉的,也请自行google,这里仍旧不赘述)

所以:

              Client->recv到数据后->数据转换成小端

              Client->send数据时->数据转换成大端

     这样才能保证Java服务器与cocos2dx的Client端正常交互;

—–上面一直在介绍Client端的知识,那么下面简单说下Server端Mina的相关知识吧——

其实对于Mina框架而言,功能强大使用简单,我们不需要关心通信,而只是需要关心数据的处理;当然对于数据的处理在Mina中最主要的就是取决于自定义的Decode 和 Encode,编码解码;

一般情况下定义好通信的数据结构,是比较关键的一点

1. 比如一般数据都有数据头的概念,其中数据头用来标识当前通信的数据的版本,标识和真实数据的长度等等。(至于如何设计这个看大家自己的想法了);

2. 数据结构中更不能少的肯定还是协议号!根据协议号,客户端和服务器才能做同一件事情;

3. 当然其中我们还会使用MD5 或者 CRC等进行数据较验等,对于MD5和CRC校验不太熟悉的也请自行google = =。

定义好数据结构后,如同Client端与Server签订了合同,彼此遵循此结构进行交互;

Server端对于收发数据的处理其实在Mina中比较容易,通过Himi的Mina博文也可以清晰容易的懂得;但是如何能让服务器根据协议号找到对应的编码解码类去处理那么才是重点;Himi这里只简单提醒你创建一个抽象类;

OK,关于数据的存放,当然Himi这里使用的Hibernate 的Annotation映射到Mysql中。比较轻松愉快~

      其实Himi以上说的虽然不是很详细,比如Client端对于Server端数据的细节处理等等;但是大概的手机网游框架和大家需要去掌握的知识点基本都没有遗漏,只要童鞋们对于文章中的所有知识点都了如指掌,OK。你Socket C/S手游框架即可开工;

下面Himi放出一张近来对于Server端的成绩图:

(Client 端:cocos2dx  /  Server端:Mina)

Client  特点: 当服务器端有数据发送给Client端,Client端自动将收到的数据索引到对应等待数据的类中;

Server 特点: 当客户端有数据发送Server端,Server端 能自动识别找到对应的编码解码类;

 

 

分享到:
评论

相关推荐

    cocos2dx3.x使用socket创建服务端和客户端

    《Cocos2dx3.x中Socket的运用:构建服务端与客户端》 ...总的来说,Cocos2dx3.x的Socket功能为开发者提供了构建网络通信的能力,但使用时需谨慎处理网络异常、并发控制等问题,以确保游戏的稳定性和用户体验。

    cocos2dx3.x游戏开发之旅电子版

    《Cocos2d-x 3.x游戏开发之旅》是一本深度探讨Cocos2dx 3.x框架的游戏开发专著,适合对游戏编程有兴趣并有一定基础的开发者。Cocos2dx是一个开源的游戏开发框架,它基于C++,同时支持多种语言,如Lua和JavaScript,...

    cocos2d-x socket网络连接

    3. **绑定地址**: 使用`bind()`函数将Socket与特定的IP地址和端口号关联,以便其他设备可以通过这个地址和端口找到我们的服务。 4. **监听与连接**:对于服务器端,调用`listen()`函数开始监听来自客户端的连接请求...

    cocos2d-x 基于BSD Socket网络通讯模块

    在Cocos2d-x中,使用BSD Socket进行网络通信可以让游戏与服务器之间进行数据交互,如用户登录、游戏状态同步、资源下载等。 **Cocos2d-x**是一个用C++编写的2D游戏引擎,支持多种平台,包括iOS、Android、Windows等...

    cocos2d-x视频教程之Socket与多线程编程-源码

    在IT行业中,Cocos2d-x是一个非常流行的开源游戏开发框架,它允许开发者使用C++、Lua或JavaScript来创建2D游戏。本教程主要聚焦于Cocos2d-x中的Socket编程和多线程技术,这对于游戏开发特别是网络交互功能至关重要。...

    cocos2dx斗地主服务端,客户端在我的资源列表中

    【标题】"Cocos2dx斗地主服务端与客户端详解" 在游戏开发领域,Cocos2dx是一款...通过对这些代码的分析和学习,开发者可以掌握网络游戏的设计原理,加深对Cocos2dx引擎的理解,以及如何构建一个跨平台的斗地主游戏。

    cocos2dx 工具之CocosBuilder

    Cocos2dx是一个广泛使用的开源游戏开发框架,基于C++,支持跨平台的游戏开发,适用于iOS、Android、Windows等多个平台。在Cocos2dx的生态系统中,有一系列强大的辅助工具,大大提升了开发效率,其中CocosBuilder就是...

    cocos2dx-2.x播放mp4

    Cocos2dx是一个基于C++的游戏开发框架,它提供了丰富的功能来帮助开发者创建2D和3D游戏。在这个场景中,我们将深入探讨如何在Cocos2dx 2.x中实现MP4视频的播放。 首先,Cocos2dx 2.x自身并不直接支持MP4格式的视频...

    Cocos2dx中UIWebView替换为WKWebView

    在iOS开发中,Cocos2dx是一个广泛使用的游戏开发框架,它允许开发者创建跨平台的2D和3D游戏。然而,随着Apple对App Store审核政策的调整,使用UIWebView的App将不再被接受,因为Apple已经将其列为弃用API。在2020年...

    cocos2dx 游戏开发系列之三 源码

    《cocos2dx游戏开发系列之三:源码解析与Android工程构建》 在游戏开发领域,cocos2dx是一个广泛使用的开源游戏引擎,尤其在跨平台开发中扮演着重要角色。本篇将深入探讨cocos2dx游戏开发系列的第三部分——源码...

    cocos2dx教程

    Cocos2DX是一款开源的游戏开发框架,主要用于创建2D和3D游戏,它基于C++,同时提供了Python、Lua等多种脚本语言接口。这个压缩包包含三本关于Cocos2DX的重要教程,分别是《Cocos2D-x权威指南》、《Cocos2d-x高级开发...

    cocos2dx 2.x 开发 示例游戏合集_C++_代码_下载

    cocos2dx 2.x 开发示例游戏合集 效果展示: https://github.com/pdpdds/cocos2dx-dev/blob/master/img/snap0215.jpg https://github.com/pdpdds/cocos2dx-dev/blob/master/img/snap0216.jpg ...

    基于cocos2dx的一个小例子

    总的来说,"基于cocos2dx的一个小例子"是一个很好的学习资源,它揭示了Cocos2dx游戏开发的基本流程和关键技术,对于初学者而言,通过这个实例可以深入理解和掌握Cocos2dx框架,为进一步的游戏开发打下坚实基础。

    cocos2d-x+socket

    总结,cocos2d-x结合Socket网络通信,能构建出高性能、实时的网络游戏。通过理解和实践上述知识点,开发者可以更好地掌握在网络环境中使用cocos2d-x进行游戏开发的技巧,从而提升游戏的用户体验和竞争力。在实际应用...

    cocos2dx 2048

    《cocos2dx 2048:游戏开发与cocos2dx框架解析》 “cocos2dx 2048”是一个基于cocos2dx框架开发的流行数字拼图游戏,它仿照了2048游戏的玩法,通过编程技术将2D图形、动画和逻辑控制融合在一起,为玩家提供了趣味且...

    android项目中嵌入cocos2dx项目demo

    Cocos2dx是一款高效的游戏开发框架,它基于C++,同时提供了Java、Objective-C和Swift的接口,使得开发者可以方便地在Android和iOS平台上进行跨平台开发。下面将详细解释如何将Cocos2dx的HelloWorld工程整合到Android...

    SublimeText启动cocos2dx3.0项目

    Cocos2dx是一款强大的跨平台游戏开发框架,而SublimeText则是一款备受开发者喜爱的文本编辑器,以其高效、轻便和丰富的插件系统著称。将两者结合,可以极大地提升Cocos2dx项目的开发效率。本篇文章将详细介绍如何...

    Game cocos2dx-C++

    对于网络游戏或需要在线数据的游戏,Cocos2dx提供了网络API,支持HTTP请求、WebSocket通信等。同时,游戏数据的本地存储可以通过SQLite数据库或者JSON文件来实现。 8. **性能优化** 了解内存管理、渲染优化、多...

    Cocos2DX源码

    Cocos2DX是一款开源的游戏开发框架,主要用于创建2D和3D游戏,它基于C++,并且支持多种平台,包括iOS、Android、Windows、Mac、Linux等。Cocos2DX的核心理念是提供一个高效、易用且功能强大的工具集,让开发者能够...

    Cocos2dx开源游戏-光线迷宫

    《Cocos2dx开源游戏-光线迷宫》是一款基于Cocos2dx游戏引擎开发的迷宫探索类游戏,它借鉴了iOS平台上的类似玩法,为玩家带来富有挑战性的游戏体验。Cocos2dx是一个广受欢迎的开源游戏开发框架,以其高效、易用和跨...

Global site tag (gtag.js) - Google Analytics