0%

对MySQL协议稍作了解后,我们就知道在协议中,服务端与客户端相互之间的通讯都是以包的形式进行的。

在这些包中,有一个固定的特征就是前四个字节用途不变,前三个字节表示数据包的长度,第四个字节表示当前包在本次交互中是序数。

前三个字节最大只能表达16M的长度,这是三个字节表达无符号整型的极限,所以,每次客户端可以接受到的最大数据包为16M+4个字节。

至于第四个字节,这是表达当前包的序数的,一个字节能表达的最大正整数是255。我们知道,在MySQL协议中,发送COM_QUERY命令后,服务器返回的数据格式为,响应头为一个包,然后,每一个字段的描述也会是一个包,字段说明后面会跟一个EOF包表示字段描述结束,之后则跟随的是表中的数据,每一个数据包表达一行数据,一般情况,我们每次从数据库里检索的条数,去掉描述协议的部分,在序数中我们还有不少空间可以用在数据记录上,但是,如果总的包数超过255,那会是怎么的情况哪?

在我们使用数据库的经验中,我们可以经常有机会看到很多条记录同时显示出来的例子,记录数明明超过了255,可是依然正常显示,这是为什么哪?

经过对MySQL交互嗅探,我发现在数据包次序达到255后,之后紧随的包的次序就变成了0,在Wireshark的协议分析中会认为这是错乱的协议,我想,这应该是MySQL特意使用的方式。

前后端的交互中,到发现次序达到255后,对序数加1,由于只使用了一个字节,所以数据溢出变成了0,这样的情况在MySQL协议中被认为是合法的,只要前后端认可这种方式,那这种通讯就不会出错。

所以我认为,在MySQL通讯中,包序号只是用来确认包的次序没有发生错误的,至于序号是几并不重要,只要认定255号后为0号是合法的,那就可以达到正常交互并保证数据序号不会出错的目的。

概述

今天学习了在Cocos2D-X开发中创建场景,以及在场景中加入图片资源,并通过写一个简单的例子对涉及到的CCLayer和CCSprite进行练习和熟悉。

过程

首先,场景类需要继承于CCLayer,并且必须实现类函数CCScene *scene()和虚函数bool init(),前者用于建立场景并在场景中加入层以备演示CCSprite,而后者则是用于对本场景进行初始化,代码如下:

GameScene.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef __HelloCocos__GameScene__
#define __HelloCocos__GameScene__

#include <iostream>
#include "cocos2d.h"

using namespace cocos2d;

class GameScene: public CCLayer {
private:
public:
virtual bool init();
static CCScene * scene();
CREATE_FUNC(GameScene);
};
#endif /* defined(__HelloCocos__GameScene__) */

以上代码, CREATE_FUNC(GameScene)是一个宏,此宏的功能是为GameScene类创建一个GameScene *GameScene::create()类函数,由于此函数的功能单一,其主要作用就是用来调用对象中的init()方法,因此,使用宏对代码进行简化是一个非常好的方法。

Read more »

最近学了一些关于Cocos2D-X的知道,在这里整理一下。

一直以来我做的都是后端的工作,现在突然有兴趣做一些前端的关于移动程序开发以及游戏开发方面的程序,对很多概念都是非常陌生的,不知道我后端开发方面的经验放在前端有没有一些用处。

Cocos2D的简单介绍

Cocos2D是一个应用非常广泛的2D游戏开发引擎,可以帮助对页面的元素进行方便的管理以及移动变形等操作,Cocos2D是基于Objective-C语言的,所以在iOS上的开发非常方便,但是跨平台方面就较差了,所以,就有了Cocos2D-X这一个基于C++的复刻版。

Cocos2D的一些概念(这里只说我学到的)

  1. 导演类CCDirector:这个类可以算是管理类,可以通过这个类获取到游戏运行界面的一些元素的属性,比如winSize等,在游戏中可以用来管理场景等。本类的使用方式为单例,通过类方法CCDirector::sharedDirecter获取对象。
  2. OpenGL类CCEGLView:对于OpenGL我不是很了解,但是我猜是可以提供类似于DirectX之类的功能,应该是管理图像动画等操作的,CCDirector需要绑定一个CCEGLView对象才可以运行,也是以单例的方式使用,通过类方法CCEGLView::sharedOpenGLView获取对象。
  3. 场景类CCScene: 场景类继承于CCNode,在其中可以放置CCLayer类。
  4. 层CCLayer:此类同样继承于CCNode,在其中可以放置CCSprite类,我的理解CCLayer就相当于电影中的幕次吧。在游戏中定义的不同游戏场景都需要继承CCLayer,必须实现的方法有virtual CCScene * scene()/static bool init()/CREATE_FUNC(CustomSceneName),其中CREATE_FUNC是宏,可以帮助建立create方法。
  5. 精灵类CCSprite:这应该是场景中更小的元素,在游戏中放置的背景、图片等都需要使用CCSprite,与CCScene一样都是继承自CCNode,由此可以判断,CCSprite类也是一个小场景,在其中可以加入其它的子元素,共同完成更复杂的动作。

目前基本只学到了这些,明天继续。

骗子出现

下午正在看书时,QQ提示有人加好友,由于我的QQ设置了加好友需要回答问题,所以,一般回答问题不是我认识的人,并且引不起我的兴趣的话我是不会加好友的。但是那骗子的QQ资料跟我一个朋友完全一样,而且我跟那朋友也好久没有联系了,虽然他在验证问题里回答的都是“认识的”,但是我还是以为是他本人换QQ了或是启用新号之类的原因,于是没有犹豫就加了好友。

为行骗做铺垫

由于我一般不会在QQ上主动跟别人说话,所以尽管加了好友但是我并没有跟他说话。

等到他主动跟我说话时我首先问了一个我比较关心的问题,就是为什么突然又加我好友,其实这个时候我还没开始怀疑,因为我根本不记得那朋友以前用的QQ号,这骗子的回答是不小心把我删了,现在又加回来,我当时虽然觉得回答合理,可还是感觉有点不对劲,事后我反应过来,如果你把一个QQ好友删掉,恐怕你根本就不会记得你删掉好友的QQ号,又怎么可能那么容易加回来哪。

然后,对方马上让我发视频,说是要看看他那边还能不能显示,于是我发送了视频请求,然后对方视频刚一显示出来一个画面就不动了,然后对方马上跟我说新西兰这边网络太差,视频太卡了,然后就关掉了视频。当时看视频显示的画面确实是我朋友,当时只是觉得这画面好眼熟,其它的也没多想。

在识穿骗子的真面目后,我去朋友Q空间相册里找到了视频里显示的照片,看到照片后我又想到一个疑点,新西兰在南半球,这个时候应该是夏秋季节,可照片里是穿厚衣服的,这很明显不对头呀。

骗子之所以来这一手,其目的就是让你认为在电脑那头的就是你朋友,当你认为这是熟人之后自然就便于骗子下手了。

Read more »

其实这篇博的题目原本是“我的C语言观”,这题目真扯淡,我是无论如何也不会想出要主动写这样的题目的,但是,因为表妹的狗P老师要求他们写这样的题目作为考试,虽然我不会帮她写作业,但是突然也想试试,对于一个这样大的题目,我都能写出什么来?所以,就试着写一下吧。

闭门造车

现在想起来,开始接触C语言已经是很久很久之前的事情了,嗯,大概是95年吧,那时候突然对计算机兴起了很大的兴趣,但是与别人不同的是,我是对计算机本身以及里面的程序感兴趣,而对于电脑游戏我有种出于本能的反感,所以在基本上学习电脑学习编程的前十年,我没接触过电脑游戏,而且偶尔的几次陪同学一起去玩游戏,也完全没感觉到好玩。

再说回学习编程语言的过程吧,最早接触编程语言我记得是在同学的学习机上,那上面提供了一种Basic语言,好像是QBasic吧,对这门语言的记忆只剩下需要在每行的前面标记行号,这是一件很不人道的事情,直到后来接触到C语言。

刚开始接触到C语言时,对于函数的定义之类的有些费解,不过好像用了不久的时间就适应了,并且很乐于使用函数,然后慢慢了解到变量范围,学会使用不同的作用范围的变量。对了,还有,go关键字,刚开始时还觉得这用起来很方便,但是时间久了发现,这并没有想象的那么容易使用,而且在程序中跳来跳去让逻辑变得很乱。

由于C语言是我真正学习的第一门编程语言,在初期,我并不知道需要把不同的函数按照功能分放在不同的文件里,这导致了刚开始写的一些小程序只有一个文件,当时觉得头文件没有必要使用,更不用说extern关键字了,我甚至以为我发现了C语言设计的一些问题。

当时因为用的操作系统是MS-DOS,使用的开发工具叫做Turbo C,虽然感觉用起来不方便,但是这总算是全屏幕编辑器,可以自由的在文件内移动光标,总比行编辑器要好。当时是不知道有Linux这种操作系统,更不知道在Linux下有编辑器之神Vi,也不知道有神的编辑器Emacs。

随着不断的学习,写的代码似乎也越来越长,这时就觉得在一个文件里写代码太麻烦了,打开文件慢,寻找相应的代码也很麻烦,这时我试着把代码按功能分置在不同的文件中。此时,我终于可以在代码中包含我自己的头文件,这突然让我感觉到一种莫名的成就感,当时甚至在考虑,我是不是有必要把自己写的代码提供给别人使用了,这样会不会让我更有成就感。

Read more »