封装cocos2dx的socket

先给大家看下example

client = new NodejsClient();
client->open("ws://www.xxxxxxxxx.com:8100");
client->addListener(NodejsClient::OPEN, CC_CALLBACK_1(Game::onOpen, this));//侦听开始
client->addListener(NodejsClient::CLOSE, CC_CALLBACK_1(Game::onClose, this));//侦听关闭
client->addListener(NodejsClient::MESSGAE, CC_CALLBACK_1(Game::onMessage, this));//侦听数据传输
client->addListener(NodejsClient::ERR, CC_CALLBACK_1(Game::onError, this));//侦听错误
client->send("msg:100");
client->close();

主要是服务器发送信息时候的侦听

void Game::onMessage(cocos2d::EventCustom* e){
std::string str = *(std::string*)e->getUserData();
CCLOG("messge from server, msg:%s", str.c_str());
}

这是头文件

#ifndef __NODE_JS_CLIENT_H__
#define  __NODE_JS_CLIENT_H__
#include "cocos2d.h"
#include "network/WebSocket.h"
class NodejsClient : cocos2d::network::WebSocket::Delegate
{
public: 
NodejsClient();
virtual ~NodejsClient();
/**
*	打开连接
*/
void open(std::string address);
/**
*	关闭连接
*/
void close();
/**
*	 发送信息
*/
void send(std::string msg);
/**
*	接收原本的数据
*/
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);
/**
*	侦听
*/
void addListener(const std::string &eventName, const std::function<void(cocos2d::EventCustom*)>& callback);
/**
*	数据连接成功
*/
static const std::string OPEN;
/**
*	接到服务器数据
*	@data	std::string	str	服务器传输的字符串
*/
static const std::string MESSGAE;
/**
*	连接关闭
*/
static const std::string CLOSE;
/**
*	错误
*	@data	int code	错误代码
*/
static const std::string ERR;
private:
/*
*	客户端
*/
cocos2d::network::WebSocket* _client;
/**
*	事件
*/
cocos2d::EventDispatcher* _evt;
};
#endif

下面是cpp

#include "game/NodejsClient.h"
USING_NS_CC;
const std::string NodejsClient::OPEN = "nodejsClientOpen";
const std::string NodejsClient::MESSGAE = "nodejsClientMessage";
const std::string NodejsClient::CLOSE = "nodejsClientClose";
const std::string NodejsClient::ERR = "nodejsClientError";
NodejsClient::NodejsClient(){
_evt = new EventDispatcher();
_evt->setEnabled(true);
_client = new network::WebSocket();
}
NodejsClient::~NodejsClient(){
}
void NodejsClient::open(std::string address){
_client->init(*this, address);
}
void NodejsClient::close(){
_client->close();
}
void NodejsClient::addListener(const std::string &eventName, const std::function<void(EventCustom*)>& callback){
_evt->addCustomEventListener(eventName, callback);
}
void NodejsClient::send(std::string msg){
_client->send(msg);
}
void NodejsClient::onOpen(cocos2d::network::WebSocket* ws)
{
_evt->dispatchCustomEvent(NodejsClient::OPEN, nullptr);
}
void NodejsClient::onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data)
{
std::string str = data.bytes;
_evt->dispatchCustomEvent(NodejsClient::MESSGAE, &str);
}
void NodejsClient::onClose(cocos2d::network::WebSocket* ws)
{
if (ws == _client)
{
_client = NULL;
}
CC_SAFE_DELETE(ws);
_evt->dispatchCustomEvent(NodejsClient::CLOSE, nullptr);
}
void NodejsClient::onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error)
{
if (ws == _client)
{
int code = (int)error;
_evt->dispatchCustomEvent(NodejsClient::ERR, &code);
}
}

linux 下查找文件或者内容常有命令

whereis <程序名称>
查找软件的安装路径
-b 只查找二进制文件
-m 只查找帮助文件
-s 只查找源代码
-u 排除指定类型文件
-f 只显示文件名
-B <目录> 在指定目录下查找二进制文件
-M <目录> 在指定目录下查找帮助文件
-S <目录> 在指定目录下查找源代码

locate <文件名称>
在文件索引数据库中搜索文件
-d <数据库路径> 搜索指定数据库
updatedb
更新文件索引数据库

find [路径] <表达式>
查找文件
-name <表达式> 根据文件名查找文件
-iname <表达式> 根据文件名查找文件,忽略大小写
-path <表达式> 根据路径查找文件
-ipath <表达式> 根据路径查找文件,忽略大小写
-amin <分钟> 过去N分钟内访问过的文件
-atime <天数> 过去N天内访问过的文件
-cmin <分钟> 过去N分钟内修改过的文件
-ctime <天数> 过去N天内修改过的文件
-anewer <参照文件> 比参照文件更晚被读取过的文件
-cnewer <参照文件> 比参照文件更晚被修改过的文件
-size <大小> 根据文件大小查找文件,单位b c w k M G
-type <文件类型> 根据文件类型查找文件。b 块设备 c 字符设备 d 目录 p 管道文件 f 普通文件 l 链接 s 端口文件
-user <用户名> 按归属用户查找文件
-uid 按UID查找文件
-group <群组名> 按归属群组查找文件
-gid 按GID查找文件
-empty 查找空文件

从文件内容查找匹配指定字符串的行:
$ grep “被查找的字符串” 文件名
从文件内容查找与正则表达式匹配的行:
$ grep –e “正则表达式” 文件名
查找时不区分大小写:
$ grep –i “被查找的字符串” 文件名
查找匹配的行数:
$ grep -c “被查找的字符串” 文件名
从文件内容查找不匹配指定字符串的行:
$ grep –v “被查找的字符串” 文件名

从根目录开始查找所有扩展名为.log的文本文件,并找出包含”ERROR”的行
find / -type f -name “*.log” | xargs grep “ERROR”

系统查找到httpd.conf文件后即时在屏幕上显示httpd.conf文件信息。
find/-name”httpd.conf”-ls

在根目录下查找某个文件
find . -name “test”

在某个目录下查找包含某个字符串的文件

grep -r “zh_CN” ./

boost安装

相关的库,先确保安装

1
yum install gcc gcc-c++ bzip2 bzip2-devel bzip2-libs python-devel

解压,转到目录

1
2
tar jxvf boost_1_54_0.tar.bz2
cd jxvf boost_1_54_0

只要执行引导文件就可以了

1
./bootstrap.sh

引导完毕就编译

1
./b2

一定要看见下面的内容才算成功,如果不成功根据提示调试

1
The Boost C++ Libraries were successfully built!

最后安装就可以了

1
./b2 install --prefix=/usr/local

ie9cookies失效问题

是框架之下出现的问题,父框架种cookies没问题,子框架种了cookies,换了页面没有cookies,其实就是没种上。看别的文章里有说在父框架写个js方法来种cookies,但是我们如果在别的平台上放游戏,肯定不能这么做。
看网上有说过跨域种cookies,下面的方法就可以做到

1
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');

nginx下安装awstats

第一步,下载并且解压

1
2
wget http://prdownloads.sourceforge.net/awstats/awstats-7.1.tar.gz
tar -zxvf awstats-7.1.tar.gz

第二部,移动目录到需要想要安装的地方,然后改一下用户,设置一下权限,主要是pl的文件要有可执行权限。
ps awstats是python写的东西,不需要安装。

1
2
3
4
5
mv awstats-7.1 /usr/local/awstats
chown -R root:root /usr/local/awstats
chmod -R =rwX /usr/local/awstats
chmod +x /usr/local/awstats/tools/*.pl
chmod +x /usr/local/awstats/wwwroot/cgi-bin/*.pl

第三部,到目录下开始执行了

1
2
cd /usr/local/awstats/tools
./awstats_configure.pl

会有下面的返回

1
2
3
4
5
6
7
8
9
10
11
12
13
#  none  (我这里是nginx 不是apache,所以是none)
#  y    (创建新的一个配置文件)
#  firefoxbug  (基于什么域名)
#
#A SIMPLE config file has been created: /etc/awstats/awstats.firefoxbug.conf
#You should have a look inside to check and change manually main parameters.
#You can then manually update your statistics for 'shiroko.cn' with command:
#> perl awstats.pl -update -config=shiroko.cn
#You can also build static report pages for 'shiroko.cn' with command:
#> perl awstats.pl -output=pagetype -config=shiroko.cn
 
#-----> Create config file '/etc/awstats/awstats.shiroko.cn.conf'
#                 Config file /etc/awstats/awstats.shiroko.cn.conf create

第四部,修改conf文件

1
vi awstats.fish.conf
1
2
#LogFile="/var/log/httpd/mylog.log"
LogFile="/var/www/fish/logs/www/access.log

第五步。建立awstats数据库,然后执行

1
2
mkdir -p /var/lib/awstats
/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=shiroko.cn

最后就是把数据发布到你想看的网站,我的网站在/var/www/shiroko/,在这里我想在这个目录下访问awstats

1
/usr/local/awstats/tools/awstats_buildstaticpages.pl -update  -config=shiroko.cn -lang=cn -dir=/var/www/shiroko/awstats

可以写一个cron,每天执行一次代码

1
crontab -e
1
2
11 59 * * * /usr/local/awastats/cron/cutlog >> /usr/local/awastats/logs/cutlog.log
00 1 * * * /usr/local/awastats/cron/build >> /usr/local/awastats/logs/build.log

PHP 配置open_basedir,让各虚拟站点独立运行 [转帖]

那天配置apache出现个很奇怪的问题

“is not within the allowed path”

于是搜索到了比较有帮助的文章

PHP 配置open_basedir,让各虚拟站点独立运行

 

open_basedir: 将用户可操作的文件限制在某目录下;

open_basedir可将用户访问文件的活动范围限制在指定的区域,通常是其家目录的路径,也可用符号”.”来代表当前目录。注意用open_basedir指定的限制实际上是前缀,而不是目录名。举例来说: 若”open_basedir = /dir/user”, 那么目录 “/dir/user” 和 “/dir/user1″都是可以访问的。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。例如设置成:“open_basedir = /dir/user/”

open_basedir也可以同时设置多个目录, 在Windows中用分号分隔目录,在任何其它系统中用冒号分隔目录。当其作用于Apache模块时,父目录中的open_basedir路径自动被继承。

有三种方法可以在Apache中为指定的用户做独立的设置:

(a) 在Apache的httpd.conf中Directory的相应设置方法:

php_admin_value open_basedir /usr/local/apache/htdocs/
#设置多个目录可以参考如下:
php_admin_value open_basedir /usr/local/apache/htdocs/:/tmp/

(b) 在Apache的httpd.conf中VirtualHost的相应设置方法:
php_admin_value open_basedir /usr/local/apache/htdocs/
#设置多个目录可以参考如下:
php_admin_value open_basedir /var/www/html/:/var/tmp/

(c) 因为VirtualHost中设置了open_basedir之后, 这个虚拟用户就不会再自动继承php.ini中的open_basedir设置值了,这就难以达到灵活的配置措施, 所以建议您不要在VirtualHost中设置此项限制. 例如,可以在php.ini中设置open_basedir = .:/tmp/, 这个设置表示允许访问当前目录(即PHP脚本文件所在之目录)和/tmp/目录.

请注意: 若在php.ini所设置的上传文件临时目录为/tmp/, 那么设置open_basedir时就必须包含/tmp/,否则会导致上传失败. 新版php则会提示”open_basedir restriction in effect”
警告信息, 但move_uploaded_file()函数仍然可以成功取出/tmp/目录下的上传文件,不知道这是漏洞还是新功能.

yum安装nginx的记录

觉得不必要每次操作还非要亲力亲为,有方便的集成环境用用也不错

这里设定源
/etc/yum.repos.d/

可以新建或者添加一个有nginx的源

[21Andy.com]
name=21Andy.com Packages for Enterprise Linux 5 - $basearch
baseurl=http://www.21andy.com/centos/5/$basearch/
enabled=1
gpgcheck=0
protect=1

实际安装

yum install -y nginx-stable mysql-server
yum install -y php-fpm php-cli php-pdo php-mysql php-mcrypt php-mbstring php-gd php-tidy php-xml
yum install -y php-xmlrpc php-pear php-pecl-memcache php-eaccelerator

#设置服务开机启动

chkconfig --level 345 mysqld on
chkconfig --level 345 php-fpm on
chkconfig --level 345 nginx on

amf的Call.BadVersion

做flash的amfphp时候
很多人问过Call.BadVersion是怎么回事。
大部分的回复都说的是php代码有问题。但是说的太笼统了。
我现在说下我遇到的问题——
1、文件格式问题:就是php的文件,比如utf8但是有bom,还有就是 的两端有空格tab换行之类的。
2、文件错误,如果php执行时候出错了,那么肯定是badVersion

nginx下的rewrite

nginx下的rewrite
wordpress下的使用

1
2
3
if (!-f $request_filename){
rewrite (.*) /index.php;
}

我本机的完整写法为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
listen       80;
charset utf8;
server_name shiroko.cn www.shiroko.cn blog.shiroko.cn;
root   /data/web/shiroko/www/blog;
index  index.html index.htm index.php;
location ~ .php$ {
include php/enable_php5.conf;
}
location / {
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
}
}

discuzX2下的使用

1
2
3
4
5
6
7
8
9
10
11
rewrite ^([^.]*)/topic-(.+).html$ $1/portal.php?mod=topic&topic=$2 last;
rewrite ^([^.]*)/article-([0-9]+)-([0-9]+).html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
rewrite ^([^.]*)/forum-(w+)-([0-9]+).html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
rewrite ^([^.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
rewrite ^([^.]*)/group-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
rewrite ^([^.]*)/space-(username|uid)-(.+).html$ $1/home.php?mod=space&$2=$3 last;
rewrite ^([^.]*)/blog-([0-9]+)-([0-9]+).html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last;
rewrite ^([^.]*)/(fid|tid)-([0-9]+).html$ $1/index.php?action=$2&value=$3 last;
if (!-e $request_filename) {
return 404;
}