ICE学习

 #ifndef MY_ICE
#define MY_ICE

module Demo
{
 interface MyIce
 {  
  idempotent void printString(string s);  
 };  
};

#endif

//slice2cpp MyIce.ice

 

// Server.cpp

#include <Ice/Ice.h>
#include "MyIce.h"

#ifdef _DEBUG
#pragma comment(lib, "iced.lib")
#pragma comment(lib, "iceutild.lib")
#else
#pragma comment(lib, "ice.lib")
#pragma comment(lib, "iceutil.lib")
#endif
using namespace std;
class MyIceII : public Demo::MyIce
{
public:
 MyIceII(){}
    virtual void printString(const string & s, const Ice::Current &);
};

void MyIceII::printString(const string & s, const Ice::Current &)
{
 if ( s == "quit")
  cout << "客户端退出" << endl;
 else
  cout << s << endl;
}


int main(int argc, char* argv[])
{
 int status = 0;
    Ice::CommunicatorPtr ic;
    try {
  //初始化Ice runtime ,将args传递给这个调用,是因为服务器可能
  //有run time感兴趣的命令行参数,返回的是一个Ice.Communicator
  //它是Ice run time的主句柄
  ic = Ice::initialize(argc, argv);
  //调用createObjectAdapterWithEndpoints创建一个对象适配器,
  //传入的参数为SimplePrinter(适配器名称)和default -p 10000
  //表示适配器使用缺省协议TCP/IP在端口10000侦听到来的请求
  Ice::ObjectAdapterPtr adapter
   = ic->createObjectAdapterWithEndpoints(
   "FirstMyIceAdapter", "default -p 10000");
  //这时候服务器端run time 已经初始化
  //现在我们实例化一个MyIceII对象,为我们的MyIce接口创建一个servant
  Ice::ObjectPtr object = new MyIceII;
  //我们调用适配器的add,告诉它有了一个新的servant ;
  //传给add 的参数是我们刚才实例化的servant,再加上一个标识符。
  //在这里,"SimplePrinter" 串是servant 的名字(如果我们有多个servant,
  //每个servant都会有不同的名字,更正确的说法是,都会有不同的对象标识)。
  adapter->add(object,
   ic->stringToIdentity("FirstMyIceAdapter"));
  //我们调用适配器的activate 方法激活适配器
  //(适配器一开始是在扣留(holding)状态创建的;
  //这种做法在下面这样的情况下很有用:
  //如果我们有多个servant,它们共享同一个适配器,
  //而在所有servant 实例化之前我们不想处理请求)。
  //一旦适配器被激活,服务器就会开始处理来自客户的请求。
  adapter->activate();
  //调用waitForShutdown。这个方法挂起发出调用的线程,
  //直到服务器实现终止为止——或者是通过发出一个调用关闭run time,
  //或者是对某个信号作出响应(目前,当我们不再需要服务器时,我们
  //会简单地在命令行上中断它)。
  ic->waitForShutdown();
    } catch (const Ice::Exception & e) {
  cerr << e << endl;
  status = 1;
    } catch (const char * msg) {
  cerr << msg << endl;
  status = 1;
    }
 //退出之前销毁通信器(如果曾经成功创建过)。
 //要使Ice run time 正常结束,这样做是必需的:
 //程序必须调用它所创建的任何通信器的destroy ;
 //否则就会产生不确定的行为。
    if (ic) ic->destroy();
    return status;
}

//Client.cpp

#include <Ice/Ice.h>
#include "../IceTest/MyIce.h"
#ifdef _DEBUG
#pragma comment(lib, "iced.lib")
#pragma comment(lib, "iceutild.lib")
#else
#pragma comment(lib, "ice.lib")
#pragma comment(lib, "iceutil.lib")
#endif

using namespace std;
using namespace Demo;
int main(int argc, char * argv[])
{
    int status = 1;
    Ice::CommunicatorPtr ic;
    try
 {
  //调用Ice::initialize 初始化Ice run time。
  ic = Ice::initialize(argc, argv);
  string str = "";
  while( true )
  {
   if (str.empty())
   {
    cout << "请输入远程IP地址" << endl;     
   }
   cin >> str ;
   string strCheck = "是否修改:Y?N";
   cout << strCheck << endl;
   cin >> strCheck;
   if (strCheck == "Y")
    continue;
   else
    break;
  }
  str = "FirstMyIceAdapter:tcp -h " + str + " -p 10000";
  //获取远程FirstMyIceAdapter的代理。
  //调用通信器的stringToProxy创建一个代理,
  //所用参数是"FirstMyIceAdapter:tcp(协议内型) -h IP地址 -p 端口号"。
  //注意,这个串包含的是对象标识和服务器所用的端口号
  Ice::ObjectPrx base = ic->stringToProxy(str);
  //stringToProxy 返回的代理的类型是Ice::ObjectPrx,这种类型
  //位于接口和类的继承树的根部。但要实际与我们的FirstMyIceAdapter交谈,
  //这里需要的是MyIce 接口、而不是Object 接口的代理。为此,这里需要调
  //用PrinterPrxHelper.checkedCast 进行向下转换。这个方法会
  //发送一条消息给服务器,实际询问“这是MyIce 接口的代理吗?”如
  //果是,这个调用就会返回MyIce 的一个代理;如果代理代表的是其他
  //类型的接口,这个调用就会返回一个空代理。

  MyIcePrx MyPrx = MyIcePrx::checkedCast(base);//uncheckedCast跟checkedcase的区别是前者可以监控跟服务器的连接。
  //测试向下转换是否成功,如果不成功,就抛出出错消息,终止客户。
  if (!MyPrx)
   throw "Invalid proxy";
  cout << "quit to exit" << endl;
  while(str != "quit")
  {
   cin >> str;
   //现在的地址空间里有了一个活的代理,可以调用printString 方法,
            //把串传给它。服务器会在它的终端上打印这个串。
   MyPrx->printString(str);
  }
  status = 0;
    } catch (const Ice::Exception & ex) {
  cerr << ex << endl;
    } catch (const char * msg) {
  cerr << msg << endl;
    }
    if (ic)
  ic->destroy();
    return status;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值