Getting Started with IceGrid

本文档介绍了如何开始使用ICE框架构建名为Ripper的应用。内容涵盖Ripper应用的初始架构,包括Ripper的注册表配置、服务器配置和客户端配置。详细步骤包括启动Ripper应用的注册表、服务器及客户端。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

The Ripper Application

Ripper.ice

#include <Ice/BuiltinSequences.ice>
module Ripper {
exception EncodingFailedException {
    string reason;
};

sequence<short> Samples;

interface Mp3Encoder {
    // Input: PCM samples for left and right channels
    // Output: MP3 frame(s).
    Ice::ByteSeq encode(Samples leftSamples, Samples rightSamples)
        throws EncodingFailedException;

    // You must flush to get the last frame(s). Flush also 
    // destroys the encoder object.
    Ice::ByteSeq flush()
        throws EncodingFailedException;
};

interface Mp3EncoderFactory
{
    Mp3Encoder* createEncoder();
};
};

MusicServer.cpp

#include <Ice/Ice.h>
#include "Ripper.h"
using namespace Ripper;

#include <iostream>
using namespace std;


class CMp3Encoder : public Mp3Encoder{
public:
	virtual ::Ice::ByteSeq encode(const ::Ripper::Samples& leftSamples, const ::Ripper::Samples& rightSamples, const ::Ice::Current& curr) {
		std::vector<unsigned char> vChar;
		vChar.push_back('M'); vChar.push_back('u');vChar.push_back('s');vChar.push_back('i');vChar.push_back('c');
		for(std::vector<unsigned char>::iterator it = vChar.begin(); it != vChar.end(); it++)	{
			cout << (*it);
		}
		cout << endl;
		return vChar;
	}
	virtual ::Ice::ByteSeq flush(const ::Ice::Current& c){
		cout << "Music" << endl;
		std::vector<unsigned char> vChar;vChar.clear();
		vChar.push_back('B'); vChar.push_back('e'); vChar.push_back('y'); vChar.push_back('!'); 
		return vChar;
	}
};

class CMp3EncoderFactory : public Mp3EncoderFactory{
public:
	virtual ::Ripper::Mp3EncoderPrx createEncoder(const ::Ice::Current& curr){
		//适配器通过标识符“Mp3Encoder”来查找;
		//通过checkedCast来转换
		Ice::Identity oId; oId.name = "Mp3Encoder";
		Mp3EncoderPrx spMp3Encoder = Mp3EncoderPrx::checkedCast(curr.adapter->createProxy(oId));
		return spMp3Encoder;
	}
};


int  main(int argc, char* argv[])  
{  
	int iStatus = 0;//程序的退出时的状态,就是否成功执行  
	Ice::CommunicatorPtr spCommunicator;//来包含Ice run time 的主句柄
	cout << "~~~~~~~~~~服务器开始启动~~~~~~~~~~~~~" << endl;

	try{   
		spCommunicator = Ice::initialize(argc, argv);   
		Ice::PropertiesPtr props = spCommunicator->getProperties();
		string sAdapter	= props->getProperty("EncoderAdapter.AdapterId");
		cout << "Adapter : " << sAdapter << endl;



		Ice::ObjectAdapterPtr pAdapter= spCommunicator->createObjectAdapter(sAdapter);   

		//此处不创建不添加:后期工厂函数返回的Mp3Encoder代理对象不存在
		Ice::ObjectPtr pMp3Encoder = new CMp3Encoder;  
		pAdapter->add(pMp3Encoder, spCommunicator->stringToIdentity("Mp3Encoder"));  

		Ice::ObjectPtr pMp3EncoderFactory = new CMp3EncoderFactory;  
		pAdapter->add(pMp3EncoderFactory, spCommunicator->stringToIdentity("factory"));  
		

		pAdapter->activate();  
		spCommunicator->waitForShutdown();  
	}   
	catch (const Ice::Exception& e){  
		cerr << e << endl;  
		iStatus = 1;  
	}   
	catch (const char* msg) {  
		cerr << msg << endl;  
		iStatus = 1;  
	}  


	if (spCommunicator){  
		try{  
			spCommunicator->destroy();  
		}   
		catch (const Ice::Exception& e) {  
			cerr << e << endl;  
			iStatus = 1;  
		}  
	}  
	return iStatus;  
}  

MusicClient.cpp

#include <Ice/Ice.h>
#include "Ripper.h"
using namespace Ripper;


#include <iostream>  
#include <string>  
#include <sstream>
using namespace std;  

int main(int argc, char * argv[])  
{  
	int status = 0;  
	Ice::CommunicatorPtr spCommunicator;  
	cout << "~~~~~~~~~~~客户端开始测试~~~~~~~~~~~~~~~~~~" << endl;

	try{  
		spCommunicator = Ice::initialize(argc, argv);  

		//Ice::ObjectPrx pProxy = spCommunicator->stringToProxy("SimplePrinter:default -p 10000");  
		//CAbsPrinterPrx pPrinter = CAbsPrinterPrx::checkedCast(pProxy);      
		//if (!pPrinter)			throw "Invalid proxy";   


		Ice::ObjectPrx proxy = spCommunicator->stringToProxy("factory@EncoderAdapter");
		cout << "第一步:获取工厂代理" << endl;
		Ripper::Mp3EncoderFactoryPrx factory = Ripper::Mp3EncoderFactoryPrx::checkedCast(proxy);
		if (!factory)			throw "Invalid factory"; 

		cout << "第二步:通过工厂函数获取压缩对象" << endl;
		Ripper::Mp3EncoderPrx encoder = factory->createEncoder();
		if (!encoder)			throw "Invalid encoder"; 

		std::vector<unsigned char> vChar = encoder->flush();
		for(std::vector<unsigned char>::iterator it = vChar.begin(); it != vChar.end(); it++)	{
			cout << (*it);
		}
		cout << endl;


	}   
	catch (const Ice::Exception & ex){  
		cerr << ex << endl;  
		status = 1;  
	}   
	catch (const char * msg){  
		cerr << msg << endl;  
		status = 1;  
	}  

	if (spCommunicator)         spCommunicator->destroy();  

	system("Pause");  
	return status;  
}  



Initial Ripper Architecture



Ripper Registry Configuration

IceGrid.Registry.Client.Endpoints=tcp -p 4061
IceGrid.Registry.Server.Endpoints=tcp
IceGrid.Registry.Internal.Endpoints=tcp
IceGrid.Registry.AdminPermissionsVerifier=IceGrid/NullPermissionsVerifier
IceGrid.Registry.Data=D:\Projects\IceMusic\Release\db\registry
IceGrid.Registry.DynamicRegistration=1

Ripper Server Configuration

EncoderAdapter.AdapterId=EncoderAdapter
EncoderAdapter.Endpoints=tcp
Ice.Default.Locator=IceGrid/Locator:tcp -h localhost -p 4061

Ripper Client Configuration

Ice.Default.Locator=IceGrid/Locator:tcp -h localhost -p 4061

Starting the Registry for the Ripper Application

>icegridregistry --Ice.Config=registry.cfg

Starting the Ripper Server

>MusicServer --Ice.Config=server.cfg

Starting the Client

>MusicClient.exe --Ice.Config=client.cfg



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值