在开发企业应用的时候,网络通信引擎的选取是至关重要的,有些大公司往往自己独立开发网络协议以及处理socket通信,但对于中小企业来说,利用开源的网络引擎无疑会给你带来很多好处,你无须再关心繁琐的编解码以及一系列协议,也无须关心底层网络通信,你只需要关心你的业务就可以了,本文介绍的是ice网络通信引擎,其中大名鼎鼎的skype的通信协议的一部分就是采用的是它!
互联网通信引擎的选型我觉得有几点很重要:
- 客户端语言无关性:目前客户端采用一种语言,服务器端采用另一种高效的语言已经比较普遍,这就需要网络通信引擎具有无言无关性,ice的客户端语言可以是java,c++,.net,PHP,Python,Pascal等
- 性能:ICE的性能可能比不上ACE,但总体来说,尚算不错
- 伸缩性和扩展能力:ice支持均衡
下面偶举一个很简单的例子,利用C#在客户端向服务器发送请求,要求服务器端打印出“Hellow world”,服务器端语言采用Java,开发步骤日下:
- 利用slice2cs生成C#客户端接口代码,其中ice文件内容如下:
module Demo { interface Printer { void printString(string s); }; };
将以上文件另存为1.ice,在控制台利用:slice2cs 1.ice,生成代码
- 利用C#编写客户端测试代码:
public static void Main(string[] args) { int status = 0; Ice.Communicator ic = null; try { ic = Ice.Util.initialize(ref args); Ice.ObjectPrx obj = ic.stringToProxy("SimplePrinter:default -p 10000"); PrinterPrx printer = PrinterPrxHelper.checkedCast(obj); if (printer == null) throw new ApplicationException("Invalid proxy"); printer.printString("Hello World,中文!"); } catch (Exception e) { Console.Error.WriteLine(e); status = 1; } if (ic != null) { // Clean up // try { ic.destroy(); } catch (Exception e) { Console.Error.WriteLine(e); status = 1; } } Environment.Exit(status); }
- 利用Java编写服务器端代码:
public static void main(String[] args) {
int status = 0;
Ice.Communicator ic = null;
try {
ic = Ice.Util.initialize(args);
Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints(
"SimplePrinterAdapter", "default -p 10000");
Ice.Object object = new PrinterI();
adapter.add(object, Ice.Util.stringToIdentity("SimplePrinter"));
adapter.activate();
ic.waitForShutdown();
} catch (Ice.LocalException e) {
e.printStackTrace();
status = 1;
} catch (Exception e) {
System.err.println(e.getMessage());
status = 1;
} finally {
if (ic != null)
ic.destroy();
}
System.exit(status);
}
测试一下吧:)