Cocos2d-x网络通信
Cocos2d-x示例提供了三种内置的网咯通信类
HttpClient,WebSocket,SocketIO。
其中第一个是简单的HTTP协议的使用,提供很多Http请求方式。
剩下的Socket*是针对类Socket连接的方式,不提供应用协议封装,所以测试的时候大部分都是Error出现,但是应该比较适合C/S模式的网络手游开发。
HttpClient使用方式简单:

WebSocket和SocketIO都要实现相应的委托基类中的纯虚函数(类似Java的抽象类的子类实现)

测试过程中WebSocket总是卡住UI,所以可能有问题。
头文件:
#ifndef __NETWORK_SCENE_H__
#define __NETWORK_SCENE_H__
#include "cocos2d.h"
#include "network/HttpClient.h"
#include "network/HttpRequest.h"
#include "network/HttpResponse.h"
#include "network/SocketIO.h"
#include "network/WebSocket.h"
class NetworkScene : public cocos2d::Layer
,public cocos2d::network::SocketIO::SIODelegate
, public cocos2d::network::WebSocket::Delegate
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
void onHttpRequestCompleted(cocos2d::network::HttpClient *sender, cocos2d::network::HttpResponse *response);
CREATE_FUNC(NetworkScene);
//SocketIO
virtual void onConnect(cocos2d::network::SIOClient* client);
virtual void onMessage(cocos2d::network::SIOClient* client, const std::string& data);
virtual void onClose(cocos2d::network::SIOClient* client);
virtual void onError(cocos2d::network::SIOClient* client, const std::string& data);
void testevent(cocos2d::network::SIOClient *client, const std::string& data);
//WebSocket,可能处理有误
virtual void onOpen(cocos2d::network::WebSocket* ws);
virtual void onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data);
virtual void onClose(cocos2d::network::WebSocket* ws);
virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error);
private:
cocos2d::network::SIOClient *client;
};
#endif //__NETWORK_SCENE_H__
实现cpp
#include "NetworkScene.h"
#include <vector>
#include <string>
#pragma warning(disable : 4996)
USING_NS_CC;
Scene* NetworkScene::createScene(){
auto scene = Scene::create();
auto layer = NetworkScene::create();
scene->addChild(layer);
return scene;
}
bool NetworkScene::init(){
if (!Layer::init()){
return false;
}
auto request = new (std::nothrow)network::HttpRequest();
request->setUrl("http://www.httpbin.org/get");
request->setRequestType(network::HttpRequest::Type::GET);
request->setResponseCallback(CC_CALLBACK_2(NetworkScene::onHttpRequestCompleted,this));
request->setTag("GET TEST1");
network::HttpClient::getInstance()->send(request);
request->release();
request = new (std::nothrow)network::HttpRequest();
request->setUrl("http://www.httpbin.org/post");
request->setRequestType(network::HttpRequest::Type::POST);
std::vector<std::string> headers;
headers.push_back("Content-Type: application/json;charset=utf-8");
request->setHeaders(headers);
const char *posData = "vistor=cocos2d-x&TestSuite=Extensions Test/NetworkTest";
request->setRequestData(posData, strlen(posData));
request->setTag("POST TEST1");
request->setResponseCallback(CC_CALLBACK_2(NetworkScene::onHttpRequestCompleted,this));
network::HttpClient::getInstance()->send(request);
request->release();
client = network::SocketIO::connect(*this,"ws://channon.us:300");
client->setTag("SOCKET TEST");
client->on("testEvent", CC_CALLBACK_2(NetworkScene::testevent, this));
//应该收不到消息,因此我关闭的太早了
client->send("SIOCLIENT");
client->disconnect();
// auto webSocket = new network::WebSocket();
// webSocket->init(*this, "ws://echo.websocket.org");
// if (webSocket->getReadyState() == network::WebSocket::State::OPEN){
// log("Waiting");
// webSocket->send("I SEND This Message");
// }
//
// webSocket->close();
return true;
}
void NetworkScene::onHttpRequestCompleted(cocos2d::network::HttpClient *sender, cocos2d::network::HttpResponse *response){
log("OK");
!= strlen(response->getHttpRequest()->getTag())){
log("%s completed ", response->getHttpRequest()->getTag());
int responseCode = response->getResponseCode();
log("%d", responseCode);
if (response->isSucceed()){
log("Successed");
}
std::vector<char> *buffer = response->getResponseData();
std::string buf(buffer->begin(), buffer->end());
log("%s", buf.c_str());
}
}
void NetworkScene::testevent(cocos2d::network::SIOClient *client, const std::string& data){
log("OK %s ",data.c_str());
}
void NetworkScene::onConnect(network::SIOClient* client)
{
log("SocketIOTest::onConnect called");
}
void NetworkScene::onMessage(network::SIOClient* client, const std::string& data)
{
log("SocketIOTest::onMessage received: %s", data.c_str());
}
void NetworkScene::onClose(network::SIOClient* client)
{
log("SocketIOTest::onClose called");
}
void NetworkScene::onError(network::SIOClient* client, const std::string& data)
{
log("SocketIOTest::onError received: %s", data.c_str());
}
void NetworkScene::onOpen(cocos2d::network::WebSocket* ws){
log("open %p", ws);
}
void NetworkScene::onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data){
log("message %p", ws);
}
void NetworkScene::onClose(cocos2d::network::WebSocket* ws){
log("close %p", ws);
}
void NetworkScene::onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error){
log("error %p", ws);
}
测试结果就无法贴出来,特别是后面的两个Socket。
以上内容仅供参考,代码很有可能有重大BUG。
以上。
Cocos2d-x网络通信的更多相关文章
- 小尝试一下 cocos2d
好奇 cocos2d 到底是怎样一个框架,正好有个项目需要一个游戏框架,所以稍微了解了一下.小结一下了解到的情况. 基本概念 首先呢,因为 cocos2d 是基于 pyglet 做的,你完全可以直接用 ...
- 采用cocos2d-x lua 制作数字滚动效果样例
require "Cocos2d"require "Cocos2dConstants"local testscene = class("testsce ...
- Cocos2d 利用继承Draw方法制作可显示三维数据(宠物三维等)的三角形显示面板
很久没有写博客了,这段时间比较忙,又是搬家又是做自己的项目,还有太多琐碎的事情缠身,好不容易抽出时间把最近自己做的一些简单例子记录一下. 在我的项目中,我需要一个显示面板来显示游戏中的一个三维数据,例 ...
- iPhone开发与cocos2d 经验谈
转CSDN jilongliang : 首先,对于一个完全没有mac开发经验,甚至从没摸过苹果系统的开发人员来说,首先就是要熟悉apple的那一套开发框架(含开发环境IDE.开发框架uikit,还有开 ...
- ZeroMQ实例-使用ZMQ(ZeroMQ)进行局域网内网络通信
本文内容摘要:1)安装zeromq.2)实例说明使用zmq进行网络间的消息发送和接收 首先在机器中安装zmq库 步骤如下: 1)下载zeromq的源代码,ZeroMQ的官方网址:http://zero ...
- cocos2d学习记录
视频 - http://www.manew.com/forum-105-3.html一个论坛帖 - http://www.zhihu.com/question/21114802官网 - http:// ...
- Android下Cocos2d创建HelloWorld工程
最近在搭建Cocos2d的环境,结果各种问题,两人弄了一天才能搞好一个环境-! -_-!! 避免大家也可能会遇到我这种情况,所以写一个随笔,让大家也了解下如何搭建吧- 1.环境安装准备 下载 tadp ...
- 学生信息管理系统(cocos2d引擎)——数据结构课程设计
老师手把手教了两天半,看了一下模式,加了几个功能就大功告成了!!! 给我的感想就是全都是指针! 添加图片精灵: CCSprite* spBG = CCSprite::create("&qu ...
- 基础笔记12(socket,url网络通信)
进一步深入socket 1.网络通信条件: .IP地址,可用主机名. .传输数据时将不用的应用程序通过数字标识区分开来,这种标识称为逻辑端口,也称端口.(0-65535端口,一般系统预留0-1024) ...
- Windows Store App 网络通信 HttpWebRequest
如果希望更好地控制HTTP请求,可以使用System.Net类库中的HttpWebRequest类,该类对HTTP协议进行了完整的封装,并且提供了很多对HTTP协议中的 Header.Content和 ...
随机推荐
- .net下BerkeleyDB操作封装C#版(附单元测试)
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System ...
- Advacned Puppet: Puppet Master性能调优
本文是Advanced Puppet系列的第一篇:Puppet master性能调优,谈一谈如何优化和提高C/S架构下master端的性能. 故事情节往往惊人地类似:你是一名使用Puppet管理线上业 ...
- JAVA B/S系统实现客户端屏幕截图,Java版的QQ截图
简介:本方法首先需要抓到屏幕的整个图象,将图象显示在一个JFrame中,再将JFrame全屏显示,这样就模拟出了一个桌面,Java也就可以获得鼠标的作用区域从而实现桌面中的小范围截屏.Java实现QQ ...
- asp.net 后台实现删除,划掉效果
效果: name = "<S>" + fircon + "</br>" + "</S>"; 增加“< ...
- C#点点滴滴:枚举enum
一.enum简介 enum为枚举类型,即一种由一组称为枚举数列表的命名常量组成的独特类型 在声明一个枚举时,要指定该枚举可以包含的一组可接受的实例值,还可以给值指定易于记忆的名称 注:如果在代码中试图 ...
- [Unit Testing] AngularJS Unit Testing - Karma
Install Karam: npm install -g karma npm install -g karma-cli Init Karam: karma init First test: 1. A ...
- HTML5新特性之跨文档消息传输
1.同域限制 所谓“同域限制”是指,出于安全考虑,浏览器只允许脚本与同样协议.同样域名.同样端口的地址进行通信. 2.window.postMessage方法 浏览器限制不同窗口(包括iFrame窗口 ...
- 创建 iPhone/iOS8 弹出菜单(窗口)
基本步骤 添加视图:主视图与弹出视图 关联视图 配置弹出视图 编码实现:弹出菜单样式及控制器委托 override func prepareForSegue(segue: UIStoryboardSe ...
- Timeout 时间已到。在操作完成之前超时时间已过或服务器未响应。
近来遇到这样一个错误:Timeout 时间已到.在操作完成之前超时时间已过或服务器未响应.错误截图如下: 错误原因分析:产生错误时我执行的操作需要的执行时间比较长.我测试了一下,那个操作用到的存储过程 ...
- JavaScript ---属性
获取属性 可以通过点(.)或方挂号([])运算符来获取属性的值. 对于点(.)来说,右侧必须是一个以属性名称命名的简单标识符.对于[]来说,方挂号内必须是一个计算结果为字符串的表达式. var aut ...