音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

如何用python开发Zeroc Ice应用
日期:2021-09-08 13:26:51   来源:脚本之家

Zeroc Ice简介

  Zeroc ICE(Internet Communications Engine ,互联网通信引擎)是目前功能比较强大和完善的RPC框架,支持跨平台、跨语言调用。它非常灵活,可以通过TCP、UDP、SSL/TSL或WebSocket连接,支持同步、异步调用,以及服务器和客户端之间的双向连接。Zeroc ICE的效率非常高,它使用一种高效的二进制协议,对带宽的消耗比较小。甚至对于通过卫星的RPC调用,Zeroc ICE还可以对数据流进一步压缩。另外Zeroc ICE还可以在不解包的情况下转发调用请求,省去普通转发时的解包、重新压包的时间。
  Zeroc ICE的应用还可以部署在icegrid上,实现网格计算,即客户端调用时不必指定目标主机,由ICE负责查找;服务端也可以在调用时才开启,动态加载;同样的服务也可以部署多个,实现高可用。

实验简介

  Zeroc ICE支持跨语言RPC调用,包括C++、C#、Java、JavaScript、Python、Objective-C、Ruby、PHP、VB等。本次实验采用Python(Pyhon 2.7以上,或者Python 3都可以)。实验的内容是在icegrid上部署一个简单的服务器,当客户端调用时输出指定内容,并返回一个字符串。实验步骤如下:

  • 安装Zeroc ICE
  • 开发服务端和客户端程序
  • 部署到icegrid
  • 客户端调用

环境准备

   本次实验采用的操作系统是Ubuntu 14.04。如果使用其他操作系统,可以根据Zeroc ICE的文档相应调整。

安装Zeroc Ice

   如果系统中没有安装Zeroc ICE,并且ubuntu的软件源中也没有zeroc ice,可以按照下面的步骤安装。

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 5E6DA83306132997
sudo apt-add-repository "deb http://zeroc.com/download/apt/ubuntu$(lsb_release -rs) stable main"
sudo apt-get update
sudo apt-get install zeroc-ice-all-runtime zeroc-ice-all-dev

  安装之后系统中就有了slice2cpp、slice2java等Sliece(Zeroc ICE定义的接口描述语言,IDL)文件到相应语言的转换程序,以及icegrid、iceregistry、icegridadmin等程序。如果缺少目标语言的工具(例如slice2py)或开发包,还需要特别安装。

安装Zeroc ICE的python开发包

  当然在这一步之前应当首先安装python和pip(python的依赖管理工具),此处略。Zeroc ICE的python开发包(或者模块)叫zeroc-ice,可以使用pip安装。

sudo -H pip install zeroc-ice

  安装过程中可能出现缺少某些C/C++头文件的问题,例如缺少python.h、openssl/ssl.h、bzlib.h,这些都是因为没有安装相应的开发包。可以通过如下的命令解决:

sudo apt-get install python-dev
sudo apt-get install libssl-dev
sudo apt-get install libbz2-dev

开发Server和Client

  下面即是真正的服务端和客户端开发。开发过程通常是:

  • 使用Slice语言定义语言无关的接口文件
  • 转换成指定语言的接口文件
  • 根据接口文件开发服务端和客户端程序
  • 书写服务端和客户端的配置文件

使用slice语言定义接口

// Printer.ice
module Demo {
  interface Printer {
     string printString(string s);
  };
};

生成指定语言的接口文件

  本次开发采用的语言是python,所以使用

slice2py Printer.ice

  其他语言可以依此类推,例如slice2java,slice2cpp。
  命令执行成功,可以看到在目标目录中生成了一个Printer_ice.py文件,以及一个Demo目录。Demo是slice接口文件中定义的module名称。

编写服务器

import sys, traceback, Ice 
import Demo

# PrinterI是接口实现类,Demo.Printer是slice2py生成的接口
class PrinterI(Demo.Printer):
  def printString(self, s, current=None):
    print(s)
    return "Server Printed: " + s 

status = 0 
ic = None

try:
  # 初始化zeroc ice环境
  ic = Ice.initialize(sys.argv)
  # 生成名为SimplePrinterAdapter的对象适配器,连接方式是缺省的tcp,监听端口10000
  adapter = ic.createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000")
  # 生成接口的实现对象,并以指定的名字SimplePrinter添加到对象适配器中
  object = PrinterI()
  adapter.add(object, ic.stringToIdentity("SimplePrinter"))
  # 激活对象适配器
  adapter.activate()
  # 使得本服务器的调用线程在此暂停,直至ice服务结束,或者进程结束
  ic.waitForShutdown()
except:
  traceback.print_exc()
  status = 1 

if ic: 
  # Clean up
  try:
    ic.destroy()
  except:
    traceback.print_exc()
    status = 1 

sys.exit(status)

  server.cfg内容如下:

PrinterAdapter.AdapterId=PrinterAdapter
PrinterAdapter.Endpoints=tcp

  其中tcp的意思通过tcp协议调用,服务器监听来自tcp协议的连接请求。

编写客户端

import sys, traceback, Ice 
import Demo

status = 0 
ic = None

try:
  ic = Ice.initialize(sys.argv)
  # 生成名为SimplePrinter代理对象,且通过tcp调用,连接目标机器的10000端口
  base = ic.stringToProxy("SimplePrinter:default -p 10000")
  # 将代理对象转换成目标对象
  printer = Demo.PrinterPrx.checkedCast(base)
  if not printer:
    raise RuntimeError("Invalid proxy")
  # 调用服务器的printString方法,并输出返回结果
  rs = printer.printString("Hello World, I'm talking to you through RPC")
  print(rs)

except:
  traceback.print_exc()
  status = 1 

if ic: 
  # Clean up
  try:
    ic.destroy()
  except:
    traceback.print_exc()
    status = 1 

sys.exit(status)

  客户端的配置文件如下:

Ice.Default.Locator=SzcIceGrid/Locator:tcp -h 127.0.0.1 -p 4061

客户端直连服务端

  上述程序开发完毕之后不用部署到icegrid就可以直接运行,配置文件是用来在icegrid上定位和连接服务。此时可以一边运行服务端,一边运行客户端,检验一下它们的功能。

python Server.py

  运行之后可以看到进程并没有结束,一直在等待连接。然后另起一个终端,运行客户端程序。

python Client.py

  运行之后可以看到服务端和客户端窗口的输出。

部署到icegrid

  icegrid是Zeroc ICE的云计算解决方案。它可以将各种服务端部署在多台机器上,并为客户端调用提供服务定位、服务激活、负载均衡、故障转移等服务。客户端只要连接到指定的服务注册中心,就可以根据服务名称(这里是SimplePrinter),以及连接协议(Endpoints,这里是tcp)就可以找到相应的服务。服务在注册时也不必处在运行状态,可以由icegrid根据调用请求,自动启动。

配置注册中心

registry.cfg(服务注册中心的配置文件)

IceGrid.InstanceName=SzcIceGrid 
#客户端连接到注册中心的地址 
IceGrid.Registry.Client.Endpoints=tcp  -p 4061
IceGrid.Registry.Server.Endpoints=tcp
IceGrid.Registry.Internal.Endpoints=tcp
IceGrid.Registry.PermissionsVerifier=SzcIceGrid/NullPermissionsVerifier
IceGrid.Registry.AdminPermissionsVerifier=SzcIceGrid/NullPermissionsVerifier
#注册中心数据保存路径,需要手动创建文件夹
IceGrid.Registry.Data=/home/rocway/test/zerocice/registry
IceGrid.Registry.DynamicRegistration=1
Ice.Admin.InstanceName=AdminInstance
Ice.Admin.ServerId=Admin

注意:手工创建文件中的路径。

配置节点

  节点是服务所在的机器。在实际生产环境中,服务注册中心也可以运行在其中某个节点上。
node1.cfg(服务所在节点的配置文件)

# 注册中心地址 
Ice.Default.Locator=SzcIceGrid/Locator:tcp -h 127.0.0.1 -p 4061 
#node名 
IceGrid.Node.Name=node1 
IceGrid.Node.Endpoints=tcp 
#node存储路径 
IceGrid.Node.Data=/home/rocway/test/zerocice/nodes/node1
IceGrid.Node.Output=/home/rocway/test/zerocice/nodes/node1
IceGrid.Node.CollocateRegistry=0

注意:手工创建上述文件中提到的路径。其中服务端程序的输出会保存在Ouput指向路径的*.out文件中。

应用描述文件

  应用描述文件用来描述服务端程序在icegrid中的部署情况。包括应用的名称、服务程序的路径、执行参数等等。
app.xml

<icegrid>
  <application name="PrinterApplication">
    <node name="node1">
      <server id="PrinterServer" exe="python" activation="on-demand">
        <adapter name="PrinterAdapter" endpoints="tcp -h 127.0.0.1">
          <object identity="SimplePrinter" type="::Demo::Printer" property="Identity"/>
        </adapter>
        <option>/home/rocway/test/zerocice/Server.py</option>  
        <property name="Ice.Trace.Network" value="1"/>
        <properties> 
          <property name="Ice.ThreadPool.Server.SizeMax" value="1" /> 
        </properties> 
            <property name="IceMX.Metrics.Debug.GroupBy" value="id"/>
            <property name="IceMX.Metrics.Debug.Disabled" value="1"/>
            <property name="IceMX.Metrics.ByParent.GroupBy" value="parent"/>
            <property name="IceMX.Metrics.ByParent.Disabled" value="1"/>   
      </server>
    </node>
  </application>
</icegrid>

启动icegrid

1.启动icegrid注册中心

icegridregistry --Ice.Config=registry.cfg

2.启动某个节点

icegridnode --Ice.Config=node1.cfg

3.启动节点上的应用管理程序, 并添加应用

icegridadmin --Ice.Config=node1.cfg

application add app.xml

4.查看已经添加的应用

application describe PrinterApplication

5.启动各节点上的应用服务

icegridgui

6.运行客户端程序

python Client.py

实验总结

  此次实验实现了在icegrid上部署服务程序,客户端通过icegrid的服务注册中心调用该服务。实验中服务端和客户端使用的都是Python,有兴趣的同学也可以分别使用不同的语言开发服务端和客户端,尝试一下Zeroc ICE的跨语言RPC调用。
  本次实验就到这里,有关Zeroc ICE的其他内容请关注后续的课程。

以上就是如何用python开发Zeroc Ice应用的详细内容,更多关于python开发Zeroc Ice应用的资料请关注其它相关文章!

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    ASP编程JSP编程PHP编程.NET编程python编程