现在的位置: 首页 > 综合 > 正文

OpenRTMFP/Cumulus开发笔记(1) 部署Cumulus

2013年08月10日 ⁄ 综合 ⁄ 共 6174字 ⁄ 字号 评论关闭

一.Server.h

#pragma once

#include "RTMFPServer.h"

#include "ApplicationKiller.h"

#include "DataContainer.h"

class Server : public Cumulus::RTMFPServer {

public:

    Server(ApplicationKiller& applicationKiller,const Poco::Util::AbstractConfiguration& configurations);

    virtual ~Server();

private:

    void manage();

    //events

    void onStart();

    void onStop();

    bool onConnection(Cumulus::Client& client,Cumulus::AMFReader& parameters,Cumulus::AMFObjectWriter& response);

    void onFailed(const Cumulus::Client& client,const std::string& error);

    void onDisconnection(const Cumulus::Client& client);

    bool onMessage(Cumulus::Client& client,const std::string& name,Cumulus::AMFReader& reader);

    void onJoinGroup(Cumulus::Client& client,Cumulus::Group& group);

    void onUnjoinGroup(Cumulus::Client& client,Cumulus::Group& group);

    bool onPublish(Cumulus::Client& client,const Cumulus::Publication& publication,std::string& error);

    void onUnpublish(Cumulus::Client& client,const Cumulus::Publication& publication);

    void onAudioPacket(Cumulus::Client& client,const Cumulus::Publication& publication,Poco::UInt32 time,Cumulus::PacketReader& packet);

    void onVideoPacket(Cumulus::Client& client,const Cumulus::Publication& publication,Poco::UInt32 time,Cumulus::PacketReader& packet);

    void onDataPacket(Cumulus::Client& client,const Cumulus::Publication& publication,const std::string& name,Cumulus::PacketReader& packet);

    bool onSubscribe(Cumulus::Client& client,const Cumulus::Listener& listener,std::string& error);

    void onUnsubscribe(Cumulus::Client& client,const Cumulus::Listener& listener);

    void onManage(Cumulus::Client& client);

private:

    ApplicationKiller& _applicationKiller;

};

注:上述各函数都是Cumulus声明的,无需改变,也无需添加别的函数

二.Server.cpp:

#include "Server.h"

#include <Poco/NumberParser.h>

using namespace std;

using namespace Poco;

using namespace Cumulus;

Server::Server(ApplicationKiller& applicationKiller,const Poco::Util::AbstractConfiguration& configurations):RTMFPServer(configurations.getInt("cores",0)),_applicationKiller(applicationKiller){

}

Server::~Server() {

}

void Server::onStart() {

}

void Server::onStop() {

}

void Server::manage() {

}

//// CLIENT_HANDLER /////

bool Server::onConnection(Client& client,AMFReader& parameters,AMFObjectWriter& response) {

    AMFWriter& amf = client.writer().writeAMFMessage("receiveConnection");

    amf.writeInteger(99);

    return true;

}

void Server::onFailed(const Client& client,const string& error) {

}

void Server::onDisconnection(const Client& client) {

}

bool Server::onMessage(Client& client,const string& name,AMFReader& reader) {

    int uriType = Poco::NumberParser::parse(name);

    std::cout<<"uriType:"<<uriType<<std::endl;

    return true;

}

//// PUBLICATION_HANDLER /////

bool Server::onPublish(Client& client,const Publication& publication,string& error) {

}

void Server::onUnpublish(Client& client,const Publication& publication) {

}

bool Server::onSubscribe(Client& client,const Listener& listener,string& error) { 

}

void Server::onUnsubscribe(Client& client,const Listener& listener) {

}

void Server::onAudioPacket(Client& client,const Publication& publication,UInt32 time,PacketReader& packet) {

}

void Server::onVideoPacket(Client& client,const Publication& publication,UInt32 time,PacketReader& packet) {

}

void Server::onDataPacket(Client& client,const Publication& publication,const string& name,PacketReader& packet) {

}

void Server::onJoinGroup(Client& client,Group& group) {

}

void Server::onUnjoinGroup(Client& client,Group& group) {

}

void Server::onManage(Client& client) {

}

总结:

1.在flash里面调用NetConnection.connect()方法时,会调用Cumulus里面的Server.cpp里面的onConnection()方法

2.所有NetConnection.call()方法都会调用Server.cpponMessage()方法,具体逻辑可以自己实现。

三.ApplicationKiller.h:

#pragma once

#include "Cumulus.h"

class ApplicationKiller {

public:

    ApplicationKiller(){}

    virtual ~ApplicationKiller(){}

    virtual void kill()=0;

};

四.Makefile的编写如下:

SRC = $(wildcard \

                        ./*.cpp \

                        ./CumulusLib/sources/*.cpp \

                       ./CumulusServer/sources/*.cpp \

             )

CC = g++

REFLAGS = -O2 -g

CFLAGS = -I/usr/local/ssl/include -I/usr/local/poco/include -I./CumulusLib/include -I./CumulusServer/sources -DCUMULUS_LOGS

EXEC = ./bin/main

LDFLAGS = -L/usr/local/ssl/lib -L/usr/local/poco/lib \

                    "-Wl,-rpath,/usr/local/lib/ \

                    ,-rpath,/usr/local/ssl/lib,-rpath,/usr/local/poco/lib"

LIBS = -lPocoUtil -lPocoXML -lPocoNet -lPocoFoundation -lcrypto -lssl -lpthread -lrt -ldl

REL_OBJS = $(SRC:%.cpp=%.o)

rel:$(REL_OBJS)

$(CC) $(LDFLAGS) $(RELFLAGS) $^ $(LIBS) -o $(EXEC)

%.o:%.cpp

        $(CC) -c $(CFLAGS) $(RELFLAGS) $< -o $@

clean:

        rm -rf $(REL_OBJS) $(EXEC)

.PHONY:rel

六.客户端

package

{

import flash.display.Sprite;

import flash.events.NetStatusEvent;

import flash.net.NetConnection;

import flash.net.ObjectEncoding;

import flash.net.Responder;

public class Main extends Sprite

{

private var _nc:NetConnection;

public function Main()

{

init();

connect();

sendMessage();

}

public function init():void{

trace("init");

if(_nc == null){

_nc = new NetConnection();

_nc.objectEncoding = ObjectEncoding.AMF3;

_nc.client = this;

}

}

public function connect():void{

trace("connect");

_nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);

_nc.connect("rtmfp://localhost:2599/");

}

public function onNetStatus(e:NetStatusEvent):void{

switch (e.info.code) {

//NetConnection

case "NetConnection.Connect.Success":

trace("connect success");

break;

case "NetConnection.Connect.Error":

case "NetConnection.Connect.Failed":

case "NetConnection.Connect.Rejected":

case "NetConnection.Connect.AppShutdown":

case "NetConnection.Connect.InvalidApp":

case "NetConnection.Connect.Closed":

trace("connect fail");

break;

default:

trace("connect fail");

break;

}

}

public function sendMessage():void{

trace("send message");

_nc.call("1",new Responder(messageResult,messageStatus),"helloworld");

}

public function messageResult(response:Object):void{

trace("response message result");

}

public function messageStatus(status:Object):void{

trace("response message status");

}

public function receiveConnection(...args):void{

trace("receive connection");

if(args.length == 1){

trace(args[0]);

}

}

}

}

七.运行顺利的话,会连接connection成功,在onConnection()函数中有相关输出,而且在onMessage()函数中能正确解析从flash客户端传递过来的字符串"1",输出1

PS:初写文章,文笔生涩之处,各位请见谅,若有疑问或者交流的,可加本人YY号:301558660

转载请注明出处:山水间博客http://blog.csdn.net/linyanwen99/article/details/8062098

抱歉!评论已关闭.