关于暗黑世界客户端的通信的一些事

 

就拿登录做一个简单说明
登录:
输入 帐号 和 密码 点击登录后
调用函数void LayerLogin::menuItemCallbackLogin(CCObject* pSender)

用的两个cocos2d-x的三个重要函数

//返回key的对象 ,不存在就返回NULL
CData::getCData()->m_dictionary->objectForKey(101);

//设置key的对象
CData::getCData()->m_dictionary->setObject(message,101);

//移除key的对象
CData::getCData()->m_dictionary->removeObjectForKey(101);

对上面两个函数内部实现有兴趣的去看下源代码,不讨论这个了

101 (它就是key)一个通信数据包的命令ID号 ,是定义好的 服务器端也是

/
//这是一个发送个人登录信息到服务器
Json::FastWriter  writer;
Json::Value person;
person[“username”]=userName;
person[“password”]=password;

std::string
json_file=writer.write(person);//192.168.1.210   114.252.70.61  183.60.243.195
//给服务器发送登录消息
SocketManager::getInstance()->sendMessage(json_file.c_str(), 101);

//0.2 秒回调一次 用于接收服务器的函数
this->schedule(schedule_selector(LayerLogin::receiveLoginData), 0.2);

//接收服务器的数据
void LayerLogin::receiveLoginData(float delta)
{
Message* revMsg2 = (Message *)CData::getCData()->m_dictionary->objectForKey(101);
CCLOG(“%s”,revMsg2);
CData::getCData()->m_dictionary->removeObjectForKey(101);
if(revMsg2){
//解除0.2 秒回调一次
this->unschedule(schedule_selector(LayerLogin::receiveLoginData));
//数据包的解析
char * denglu=revMsg2->data;
CCLog(“%s”,denglu);
CData::getCData()->setSendVal(denglu1);
Json::Reader read;
Json::Value root;
bool result;
Json::Value data;
if(denglu){
if (read.parse(denglu, root)) {
Json::Value data=root[“data”];
std::string message=root[“message”].asString();
result=root[“result”].asBool();
if(result)
{

CData::getCData()->setCharactorId(data[“characterId”].asInt());
hasRole=data[“hasRole”].asBool();
CData::getCData()->setUserId(data[“userId”].asInt());
//。。处理是否通过


}
json是一个库来的,用于系列化 反系列化
关于它的说明 :http://www.json.org/json-zh.html
这是类似 http://www.cnblogs.com/Mainz/archive/2011/03/07/1973361.html

到这里的时候没有看到在那里说明了是在接收服务器数据

SocketClient 类的两个函数都是一直在循环中
//发送数据包线程
static void* ThreadSendMessage(void p);
//接收数据包线程
static void
ThreadReceiveMessage(void *p);

在它ThreadReceiveMessage 你就会看到
设置key对象
CData::getCData()->m_dictionary->setObject(message,bytesToInt(message->commandId));

其实通信的时候,你得知道人家地址,你像你寄个包裹,你不知道地址你寄给谁啊
这个就是我们说的IP地址了!
//就是这里了
SocketManager::getInstance()->startSocket();
{
//传说中服务器地址……
_socket = new SocketClient(“183.60.242.26”,31009,1,1,NULL);
}

class Message:public CCObject
{
public:
char HEAD0;
char HEAD1;
char HEAD2;
//数据包验证
char HEAD3;
char ProtoVersion;
//版本号 不知道是想做什么用的?
byte serverVersion[4];
//服务器版本号
byte length[4];
byte commandId[4];
/**
* 消息的数据
/
char
data;
Message();

int datalength();

~Message();

};

byte commandId[4];

很奇怪key是int类型是吧,这里
//设置key的对象
CData::getCData()->m_dictionary->setObject(message,101);
可以去查下char[4]互转 int资料。。

一些资料
http://blog.codingnow.com/2006/04/iocp_kqueue_epoll.html
http://blog.csdn.net/shallwake/article/details/5265287
好吧,就写到这里了,其实有好多东西想写的,但是又感觉写不出来!如果有不对的地方请各位指正
等我那天心血来潮就来写下服务器端吧!可能遥遥无期,嘿嘿
网络编程不容易。。。。。。