ring方法
8.struct PrinterImp : Printer{
9. virtual void printString(const ::std::string&; s,
10. const ::Ice::Current&; = ::Ice::Current())
11. {
12. cout << s << endl;
13. }
14.};
15.
16.int main(int argc, char* argv[])
17.{
18. Ice::CommunicatorPtr ic;
19.
20. try{
21. // 初始化Ice运行库
22. ic = Ice::initialize(argc, argv);
23. // 建立ObjectAdapter,命名为SimplePrinterAdapter
24. // 使用默认协议(一般是tcp)并在10000端口监听。
25. Ice::ObjectAdapterPtr adapter
26. = ic->createObjectAdapterWithEndpoints(
27. "SimplePrinterAdapter", "default -p 10000");
28. // 把我们实现的Printer加入ObjectAdapter,并命名为SimplePrinter
29. Ice::ObjectPtr object = new PrinterImp;
30. adapter->add(object, ic->stringToIdentity("SimplePrinter"));
31. adapter->activate();
32. // 等待直到Communicator关闭
33. ic->waitForShutdown();
34. }
35. catch(const Ice::Exception &;e){
36. cerr << e << endl;
37. }
38. catch(const char* msg){
39. cerr << msg << endl;
40. }
41. // 回收Ice运行库所用的资源
42. if(ic) ic->destroy();
43.
44. return 0;
45.}
客户端代码:
1.#include
2.#include
3.
4.using namespace std;
5.using namespace Demo;
6.
7.int main(int argc, char* argv[])
8.{
9. Ice::CommunicatorPtr ic;
10. try{
11. // 初始化Ice运行库
12. ic = Ice::initialize(argc, argv);
13. // 在10000端口取得SimplePrinter代理对象
14. Ice::ObjectPrx base = ic->stringToProxy("SimplePrinter:default -p 10000");
15. // 把对象转换成Printer代理
16. PrinterPrx printer = PrinterPrx::checkedCast(base);
17. if(!printer) throw "Invalid Proxy!";
18. // 能过这个代码调用printString方法
19. printer->printString("Hello World!");
20. }
21. catch(const Ice::Exception &;e){
22. cerr << e << endl;
23. }
24. catch(const char* msg){
25. cerr << msg << endl;
26. }
27. // 回收Ice运行库所用的资源
28. if(ic) ic->destroy();
29.
30. return 0;
31.}
编译服务器端和客户端,然后启动一个服务器端,每次调用客户端后服务器端会显示一行Hello world!
你也可以把服务器端放到别的电脑上,客户端代码改成:Ice::ObjectPrx base = ic->stringToProxy("SimplePrinter:default -h 服务端IP -p 10000");即可实现远程调用。
看上去我们写一个Helloworld的程序要弄这么一大堆的东西,不过实际上只要我们修改Slice定义,我们就可实现更强大的功能,而代码并不需要多大变化。
使用Ice::Application简化代码的编写
对比上例中的服务端和客户端代码,可以发现占很大比例的代码都是初始化、异常捕捉、回收资源这样的“样板”代码。ICE针对这些“样板”代码提供了Ice::Application类来封装它们(而且它做得更多),通过它我们就可以简化上例中了代码了。
Ice::Application中有一个纯虚函数
virtual int run(int, char*[]) = 0;
我们只要实现这个run方法,其它的一切都由Application完成:
服务器端:
1.#include
2.#include "printer.h"
3.
4.using namespace std;
5.using namespace Demo;
6.
7.struct PrinterImp : Printer{
8. virtual void printString(const ::std::string&; s, const ::Ice::Current&; = ::Ice::Curre
nt())
9. {
10. cout << s << endl;
11. }
12.};
13.
14.class MyApp : public Ice::Application{
15.public:
16. virtual int run(int, char*[]){
17. Ice::CommunicatorPtr&; ic = communicator();
18. Ice::ObjectAdapterPtr adapter
19. = ic->createObjectAdapterWithEndpoints(
20. "SimplePrinterAdapter", "default -p 10000");
21. Ice::ObjectPtr object = new PrinterImp;
22. adapter->add(object, ic->stringToIdentity("SimplePrinter"));
23. adapter->act