一.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.cpp的onMessage()方法,具体逻辑可以自己实现。
三.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