#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;
}
#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;
}