异想天开

What's the true meaning of light, Could you tell me why

OpenRtmfp服务器管理peer

日期:2014-11-25 10:45:53
  
最后更新日期:2015-09-30 13:58:08
【技术文章】
一个flash客户端连上OpenRtmfp服务器,就是一个在线的peer。peer在生存周期内会定时向服务器发送ping心跳包。OpenRtmfp服务器在启动时会起一个RTMFPManager线程来管理peer。创建RTMFPManager对象的启动代码,省略部分代码:
[code lang="cpp"]
void RTMFPServer::run() {
try {
_pSocket->bind(SocketAddress("0.0.0.0",_port));
_mainSockets.add(*_pSocket,*this);

NOTE("RTMFP server starts on %u port",_port);
onStart();

RTMFPManager manager(*this);
bool terminate=false;
while(!terminate)
handle(terminate);

} catch(Exception& ex) {
...
}
[/code]
这里RTMFPManager对象是临时对象,但这个循环永远不会退出,故生命周期与进程的生命周期一致。
RTMFPManager是一个封装的线程类,其类的方法不多,故整体摘录如下:
[code lang="cpp"]
class RTMFPManager : private Task, private Startable {
public:
RTMFPManager(RTMFPServer& server):_server(server),Task(server),Startable("RTMFPManager") {
start();
}
virtual ~RTMFPManager() {
stop();
}
void run() {
setPriority(Thread::PRIO_LOW);
do {
waitHandle();
} while(sleep(2000)!=STOP);
}
private:
void handle() {
_server.manage();
}
RTMFPServer& _server;
};
[/code]
可以看出线程的run方法,定时执行handle方法(waitHandle方法最终执行Task的handle方法),即定时执行RTMFPServer实例的manage()方法。我们看下RTMFPServer::manage()方法如下:
[code lang="cpp"]
void RTMFPServer::manage() {
_handshake.manage();
_sessions.manage();
}
[/code]
_sessions记录了所有连上服务器的peer的会话信息,_handshake记录正在连接的会话(handshake),这里需要处理掉已经掉线的客户端,比如flash客户端连服务器,四次握手的过程发完ihello包就掉线了这种情况。
注:
一般对于整套系统还有另外的服务器协调管理在线peer,那么在这里还需要向其它server发送peer的ping包和logout包。