【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(&amp;sa, 0, sizeof(sa));

    memcpy((char*)&amp;sa.sin_addr, hp-&gt;h_addr, hp-&gt;h_length);

    sa.sin_family = hp-&gt;h_addrtype;

    sa.sin_port = htons(port);

 

    socketHandle = socket(sa.sin_family, SOCK_STREAM, 0);

 

    if(socketHandle &lt; 0){

        printf( "failed to create socket\n" );

        return -1;

    }

    if(::connect(socketHandle, (sockaddr*)&amp;sa, sizeof(sa)) &lt; 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(&amp;tAttr);

 

        CC_BREAK_IF(errCode!=0)

 

        errCode = pthread_attr_setdetachstate(&amp;tAttr, PTHREAD_CREATE_DETACHED);

 

        if (errCode!=0) {

            pthread_attr_destroy(&amp;tAttr);

            break;

        }

 

        errCode = pthread_create(&amp;threadHimi, &amp;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端 能自动识别找到对应的编码解码类;

时间: 2024-08-31 23:19:36

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

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

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

安卓 socket wifi-安卓Wifi连接实现socket通信

问题描述 安卓Wifi连接实现socket通信 两部安卓手机通过Wifi连接,通过socket通信,Wifi由路由器发出,但socket的IP地址写的是路由器的地址根本无法实现通信,是哪里有错吗??

Visual C#.Net 网络程序开发-Socket篇第1/2页_C#教程

Visual C#.Net 网络程序开发-Socket篇   作者: 宋华  作者: www.ASPCool.com  Microsoft.Net Framework为应用程序访问Internet提供了分层的.可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用程序..Net类采用的分层结构允许应用程序在不同的控制级别上访问网络,开发人员可以根据需要选择针对不同的级别编制程序,这些级别几乎囊括了Internet的所有需