插件编程示例

为测试nw客户端对服务器消息推送的响应.

测试通知消息:176-Indication

参数名: message
每隔5秒发送一个订单或退单通知,含随机单据编号信息.
 
涉及编程内容:
.创建一个定时任务
.连接事件挂钩
.发送消息
 
实现时发现框架没有广播消息接口.什么情况下需要?

xbox.cpp


ACE_THR_FUNC_RETURN NotifyMessage(void *arg) {
	CXboxPlugin::instance()->NotifyMessage();
	return 0;
}


int CXboxPlugin::NotifyMessage() {
	CMsg *msg = new CMsg;
	msg->SetMsgType(MT_INDICATION);
	msg->SetMsgID(176);
	char sheet_type[][16] = {"订单","退单"};
	int rand_val = Rand();
	string text = LogMsg("您接收到一个%s,单据编号:%lu",sheet_type[rand_val%2],rand_val);
	msg->AddParam("message",text.c_str());

	CWrappedMsg<> *pwm = new CWrappedMsg<>;
	pwm->msg = msg;
	int count = 0;
	{
		ACE_WRITE_GUARD_RETURN(ACE_Thread_Mutex,m,client_mutex_,-1);
		vector<unsigned long>::iterator iter = clients_.begin();
		while(iter!=clients_.end()) {
			pwm->connid.push_back(*iter);
			iter++;
			count++;
		}
	}
	if (count==0) {
		delete pwm;
		return 0;
	}
	network_->SendMsg(pwm);

	return 0;
}


int CXboxPlugin::handle_input(unsigned long fd, HTX_Reactor_Mask mask,HTX_Event_Arg *arg) {
	if (mask==HTX_Reactor_Base::CONNECT_MASK) { 
		ACE_WRITE_GUARD_RETURN(ACE_Thread_Mutex,m,client_mutex_,-1);
		clients_.push_back(fd);
	}
	else if (mask==HTX_Reactor_Base::CLOSE_MASK) {
		ACE_WRITE_GUARD_RETURN(ACE_Thread_Mutex,m,client_mutex_,-1);
		vector<unsigned long>::iterator iter = clients_.begin();
		while(iter!=clients_.end()) {
			if (*iter==fd) {
				clients_.erase(iter);
				break;
			}
			iter++;
		}
	}

	return 0;
}



int CXboxPlugin::Activate() {
	reactor_->register_handler(this,HTX_Reactor_Base::CONNECT_MASK|HTX_Reactor_Base::CLOSE_MASK);
	int rand_val = Rand();
	enum { NOTIFY_INTERVAL=5}; ///< 通知消息间隔
	IDeamonTask *task = deamon_mgr_->add(::NotifyMessage,"NotifyMessage",this);
	task->set_timer_strategy(NOTIFY_INTERVAL);
	
	return 0;
}	

xbox.h

class  CXboxPlugin :
public IEventHandler ,
public HTX_Event_Handler, /// 增加
public CBasePluginModule {

  ///< 增加以下代码:
	ACE_Thread_Mutex client_mutex_; ///< clients_互斥体
	vector<unsigned long> clients_; ///< 连接的客户端通道
	int NotifyMessage(); ///< 向所有在线连接发送一个通知消息
	int handle_input(unsigned long fd, HTX_Reactor_Mask masks,HTX_Event_Arg *arg);
	
	...
};	


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值