ICE学习笔记(01):Slice规范

Medooze流媒体服务器:RTMP与WebRTC视频编解码转换与性能优化 在实时音视频通信与直播领域,视频编解码是核心技术,它决定了视频数据的压缩效率、传输质量和延迟。其原理是将原始像素数据通过特定算法压缩,以节省带宽,再在接收端解码还原。这项技术的价值在于,它使得高清、低延迟的实时互动成为可能,广泛应用于在线教育、视频会议和互动直播等场景。其中,RTMP和WebRTC是两种主流的流媒体协议,它们对视频数据的封装和传输方式不同。本文以Medooze开源服务器为例,深入解析其内部如何高效处理RTMP的H.264流与WebRTC的VP8/H.264流之间的转换,核心在于区分转封装与转 阅读详情

【 colorado 】


按语:本文是DPWI第4章的笔记。在3.3.1版的1~9章中与1.3.0版马维达先生中译本相应章节的内容基本相同,变化比较小,可以参考马维达 先生的译本。

 

Slice 在客户与服务器之间建立合约,描述应用程序所使用的各种类型及对象接口。这种描述与语言实现无关。Slice 定义由编译器编译到特定的实现语言,编译算法称之为语言映射。编译器把与语言无关的定义翻译成针对特定语言的类型定义和API。开发者使用这些类型和API 来提供应用功能,并与Ice 交互。Ice 目前支持C++,Java, C#, Python,PHP,Ruby的语言映射。

 

例如:
/*
  Printer Slice
*/
#ifndef SIMPLE_ICE
#define SIMPLE_ICE

module Demo
{

    interface Printer
    {
        void printString(string s); //打印字符串
    };

};

#endif
Slice 关键字小写,只有Object、LocalObject首字母大写。
标识符大小写不敏感,不能有下划线。标识符必须保持拼写一致。以Ice开头的标识符被保留。将Slice关键字用作标识符,使用反斜线转义。如 /dictionary。

模块 : Slice所有定义嵌套进模块中。
module ZeroC {
    module Client {
        // Definitions here...
    };
    module Server {
        // Definitions here...
    };
};
重新打开模块:
module ZeroC {
    // Definitions here...
};
// Possibly in a different source file:
module ZeroC { // OK, reopened module
    // More definitions here...
};

 

Slice 数据类型

类型

映射类型的范围

映射类型的大小

bool

flase / true

≥ 1 位

byte

-128~127

≥ 8 位

short

-215 ~215

≥ 16

int

-231 ~231 -1

≥ 32 位

long

-263 ~263 -1

≥ 64 位

float

IEEE 单精度类型

≥ 32 位

double

IEEE 双精度类型

≥ 64 位

string

所有Unicode 字符,除了所有位为零的字符。

可变长度


Slice 提供了整数类型short、int,以及long,没有提供无符号类型。
Slice 串使用的是Unicode 字符集。唯一一个不能出现在串中的字符是零字符。

Slice 的byte 类型是一种(至少) 8 位的类型,当在地址空间之间传送时,它保证不会发生任何改变。

枚举:
enum Fruit { Apple, Pear, Orange };
Slice没有定义枚举的顺序值。

结构:
struct TimeOfDay {
    short hour; // 0 - 23
    short minute; // 0 - 59
    short second; // 0 - 59
};
Slice类型定义,除模块外不能嵌套;因此结构不能嵌套定义,但可以这样定义:
struct Point {
    short x;
    short y;
};
struct TwoPoints { // Legal (and cleaner!)
    Point coord1;
    Point coord2;
};

序列: 变长的元素向量
sequence<Fruit> FruitPlatter;
sequence<FruitPlatter> FruitBanquet;

词典: 从键类型到值类型的映射
dictionary<long, Employee> EmployeeMap;
词典的键类型无需为整型
dictionary<string, string> WeekdaysEnglishToGerman;
不能使用浮点值或嵌套结构作键

接口:
interface Clock {
    TimeOfDay getTime();
    void setTime(TimeOfDay time);
};

参数:
定义的操作既有输入参数,又有输出参数,输出参数必须放在输入参数的后面:
void changeSleepPeriod( TimeOfDay startTime,
                        TimeOfDay stopTime,
                    out TimeOfDay prevStartTime,
                    out TimeOfDay prevStopTime);


Slice 不支持既是输入、又是输出参数的参数。
Slice 不支持操作重载,同一接口中的各个操作必须具有不同的名称。

幂等操作: 多次执行同一操作,结果不变,关键字idempotent
interface Clock {
    idempotent TimeOfDay getTime();
    idempotent void setTime(TimeOfDay time);
};

用户异常:

exception Error {}; // 异常可以为空

exception RangeError {
    TimeOfDay errorTime;
    TimeOfDay minTime;
    TimeOfDay maxTime;
};

interface Clock {
    idempotent TimeOfDay getTime();
    idempotent void setTime(TimeOfDay time) throws RangeError, Error;
};
异常可以继承。在运行时,可以抛出任何与异常规范中列出的异常类型兼容的异常。
如果客户端不识别接收的派生异常,只识别基异常,就将接收的异常切成基异常。

Ice:Exception → LocalException → Run-time Exception

                      ↘UserException

主要的运行时异常:
a• ObjectNotExistException:找不到对象
b• FacetNotExistException:找不到层面
c• OperationNotExistException:找到服务者,但找不到操作。

服务器端错误产生的一般异常:
UnknownUserException:抛出的Slice异常没有在异常规范中声明。
UnknownLocalException:上述a,b,c三种异常之外的运行时异常
UnknownException:非Ice异常,如C++异常。

代理:
interface Clock {
    idempotent TimeOfDay getTime();
    idempotent void setTime(TimeOfDay time);
};
dictionary<string, Clock*> TimeMap; // 时区 — 时钟

interface WorldTime {
    idempotent void addZone(string zoneName, Clock* zoneClock);
    void removeZone(string zoneName) throws BadZoneName;
    idempotent Clock* findZone(string zoneName) throws BadZoneName;
    idempotent TimeMap listZones();
    idempotent void setZones(TimeMap zones);
};
Clock* —> 接口* —> 代理:类似C++对象指针
* 称为代理操作符,*号左边必须是接口/类


接口继承:
interface AlarmClock extends Clock {
    idempotent TimeOfDay getAlarmTime();
    idempotent void setAlarmTime(TimeOfDay alarmTime);
};
接口可以多继承:
interface RadioClock extends Radio, AlarmClock ....
多个接口不能含有同名操作。即如果Radio中有set操作,AlarmClock中有set操作,则
RadioClock不能从两个接口继承。

所有接口最终都派生自Object。
Ice支持null代理。
不要定义空接口,在设计上是错误的。

类:
类允许你在客户端实现行为,而接口只允许你在服务器端实现行为。
不要定义空类,在设计上是错误的。

class TimeOfDay {...}
class DateTime extends TimeOfDay {...}
类只支持单继承,下面的定义是错误的:
class DateTime extends TimeOfDay, Date {...}
派生类不能重新定义基类数据成员。

类的操作是本地操作,调用类上的操作并不会产生远程过程调用。在线上传输类时,Ice运行时只整编类的数据成员。接收者在自己的地址空间里实例化这个类,负责为类提供操作的实现代码。即提供一个类工厂。

要记住,一旦你使用了有操作的类,你实际上就是在使用客户端原生代码,因此,你不再能享受到接口所提供的实现透明性。建议最好使用接口和没有操作的类。

class Clock implements Time {...} 类实现接口
class RadioClock implements Time, Radio {...} 类实现多个接口
class RadioAlarmClock extends Clock implements AlarmClock, Radio {...}类继承及实现
类不能重定义基接口或基类继承的操作或数据成员。

interface Example {
    TimeOfDay* get();
};
get返回TimeOfDay类代理。客户可以通过这个代理调用操作,但不能访问数据成员。这是因为代理没有数据成员的概念。

定义操作时,将接口作为参数,使得接口以传值方式传递。由于接口在实现时是抽象的,因此实参应该传入实现接口的类。

提前声明:
interface Time;
class TimeOfDay;

类型ID
::MyModule::Child;

Object的操作
ice_ping 测试某个对象是否可到达
ice_isA  测试目标对象是否支持指定的类型
ice_id   接口的派生层次最深的类型ID
ice_ids  含有某个接口所支持的所有类型ID的序列

本地类型:
local关键字定义了只在本地访问的API。Slice 编译器不会为相应的类型生成整编代码。这意味着,本地类型永远不能从远程访问,因为它不能在客户和服务器之间传送。

local 主要用于Ice运行时的各种API。

名字与作用域:
如果两个标识符只有大小写不同,将被认为是相同的。Slice 编译器还要求你在使用标识符时,始终使用同样的大小写。否则会产生编译错误。

元数据指令:
["java:type:java.util.LinkedList"] sequence <int> IntSeq;
指示编译Java程序时,使用LinkedList表示序列。

全局元数据指令:
[["java:package:com.acme"]]
所有使用本Slice定义的Java程序,引入包名com.acme

废弃的Slice定义:
["deprecated:....."]
冒号跟着警告消息,可忽略。

Slice检查和:
检查C/S两端的Slice定义是否一致:
#include <Ice/SliceChecksumDict.ice>
interface MyServer {
    idempotent Ice::SliceChecksumDict getSliceChecksums();
    // ...
};

词典类型:dictionary<string, string> SliceChecksumDict;
词典中每个元素的键是一个Slice类型ID,并且值是该类型的检查和。

 

 

【信息科学与工程学】【安全领域】 第八十八篇 网络空间安全21 如果员工认为安全政策和流程(如复杂的密码规则、频繁的认证、繁琐的软件安装审批)阻碍了工作效率,他们可能会寻找变通方法,例如:写下密码、共享账户、使用未经批准的云服务(影子IT)、绕过安全控制。例如,一个用于显示用户列表的API,可能返回每个用户的完整个人资料,包括邮箱、地址、电话等敏感字段,而前端可能只显示了姓名。:在OAuth 2.0或OIDC流程中,攻击者可能截获授权请求中的“授权码”,或窃取“访问令牌”,然后将其用于另一个客户端(非原始授权的客户端),从而以用户身份访问受保护的资源。 阅读详情

相关推荐

ice性能测试,用于评估网络通讯库性能

基于互联网通讯引擎开发的测试程序,用于评估网络通讯核心在各种通讯协议,通讯方式、数据类型、数据大小、延时等性能参数的传输性能。

ice异常ObjectNotExistException及Servant之理解

今天在公司调试ice的时候,出现了一个ObjectNotExistException的异常,这个异常是server返回给client,server是用java编写的,client是用php编写的,用ice来实现php和java的协作。遇到ObjectNotExistException这样的异常,当时google了一下,知道是客户请求所包含的对象标识没有对应的条目,也就是连接已经建好了,但是client请求的对像不存在,所以才有这样的异常。当时只是略看了一下,没有作仔细阅读,也没有完全弄明明白白,回家后感觉到

lamp专栏 5628

ZeroC提 供的一款高性能的中间件 ICE

ICE(Internet Communications Engine)是ZeroC提 供的一款高性能的中间件,基于ICE可以实现电信级的解决方案。前面我们提到过在设计网站架构的时候可以使用ICE实现对网站应用的基础对象操作,将基础 对象操作和数据库操作封装在这一层,在业务逻辑层以及表现层(java,php,.net,python)进行更丰富的表现与操作,从而实现比较好的架 构。基于ICE的数据层可以在未来方便的进行扩展。ICE支持分布式的部署管理,消息中间件,以及网格计算等等。

Ice

无语呀 真是摸着石头过河 啥都不知道 网上的资料竟然这么少 搞的我一个头三个大啊 不过呢 总算有那么点眉目了 开始的时候为了运行我写的程序 我在官网上下载Ice的版本 http://www.zeroc.com/download/Ice/3.3/ 下载了Ice-3.3.0.zip 冤枉啊 我竟然解压没找到lib和bin目录 我当时真是相当的无语啊 然后这怎么配环境变量啊 ...

iteye_17122的博客 243

yolov5深度剖析+源码debug级讲解系列(一) yolov5的架构和源码debug准备

前言 前段时间分析了yolov3的源码,这次想带着小伙伴一起把yolov5完全掌握。博主还是保持着一贯的风格,依旧采用debug级别的源码剖析。目的就是让大家可以通过一个系列的文章就把yolov5的架构、设计理念和每一行源码都弄懂。只要小伙伴可以花时间把这个系列读完,就会对yolov5的理解有所提升。 去年参加了kaggle的小麦检测比赛,yolov5在比赛的中段开始呈现霸榜趋势,超越了efficientdet。虽然最后yolov5因为权限等某些问题被kaggle官方禁用了,但是仍然体现出了其强大的能力。值

人唯优的博客 4万+

SSE消息推送避坑指南:从Chrome兼容性到Spring超时配置

本文深入探讨了在Java Spring Boot项目中实现SSE消息推送时,从浏览器兼容性到后端配置的完整避坑指南。针对Chrome并发连接限制、Safari自动断开、Nginx代理缓冲以及Spring SseEmitter内存泄漏与超时管理等生产环境常见问题,提供了具体的解决方案和最佳实践配置,帮助开发者构建稳定可靠的实时推送系统。

work3的博客 450

ICE入门

转载自:http://joeywanghome.spaces.live.com/blog/cns!ddf8393aef49368b!163.entry?wa=wsignin1.0&sa=984310076 只为自己日后翻阅方便,不做他用,特此声明 ICE初始用之经验教训 这个项目涉及两种语言,c++和java。使用ICE中间件。其中有一部分就是java通过ICE调用后台的由c++实 ...

loyalbluer的专栏 308

EBS开发_离散工单创建API

--以下代码于20171213在TONY环境中实现 DECLARE     l_iface_rec    wip.wip_job_schedule_interface%ROWTYPE; --工单任务接口表     l_group_id     NUMBER;     l_returnstatus VARCHAR2(40);     l_errormsg     VARCHAR2(2000

蜗牛先生快跑的博客 2596

PHP中间件ICE,ICE的安装配置,ICE常见编译和运行(异常)错误(自测Php版本安装部分,因为php版本跟ice版本不一样失败)

ICE(Internet Communications Engine)是Zeroc提供的一款高性能的中间件。使用ICE能使得php(或c++,java,python)与java,c++,.net,python等进行交互。基于ICE可以实现电信级的解决方案。   1。为什么要使用中间件? 设想一个这样的场景:对于一个大型网站来说,往往有很多个web服务器,每个web服务器都存在很多对于数据库的

gb4215287的博客 3056

生信入门(六)——单细胞分析(Seurat)

生信入门(六)——单细胞分析(Seurat) 文章目录生信入门(六)——单细胞分析(Seurat)一、数据导入1、数据来源2、数据导入二、标准预处理1、QC和选择细胞进行进一步分析2、规范化数据3、识别高度可变的特征(特征选择)4、缩放数据三、主成分分析(PCA)1、线性降维2、确定数据集的“维度”四、聚类细胞五、非线性降维(UMAP/tSNE)六、寻找差异表达的特征(簇生物标志物) 一、数据导入 1、数据来源 点击此处下载数据 数据说明:分析10X Genomics提供的外周血单细胞(PBMC)数据集,有

羊羊的博客 6万+

/proc/sys/vm/max_map_count耗尽时,调用glibc 2.11.3 free()导致程序crash,问题追踪和解决

1. 问题 在客户环境下,当我们的程序消耗较大内存时,会偶尔crash。 通过gdb分析,程序core dump在malloc/free函数内。 当把/proc/sys/vm/max_map_count 从65530增加到131070,程序再也不crash。 相关命令 echo 131073 > /proc/sys/vm/max_map_count 2.  core

万大胖博客,苦并快乐着 4430

ICE常见异常原因

ICE常见异常原因: Ice::NoEndpointException: no suitable endpoint available for proxy : 代理还没发布。 Ice::ObjectNotExistException: object does not exist : 适配器里没有这个对象,或者代理对象被析构。 NodeUnreachableException:icegridnode进程没有启动或者未初始化完成。 DeploymentException:部署异常。 IceUtil::

armpchannel的博客 5311

msfvenom制作windows/linux/android/ios木马

msfvenom选项如下 -p, --payload<payload> 指定 payload(攻击荷载)。如果使用自定义payload,请使用'-'或者stdin指定。 -l, --list [module_typel列出指定模块的所有可用资源。模块类型包括:payloads, encoders, nops, all -n, --nopsled <length>为payload预先指定一个NOP滑动长度。 -f, --format <format>指定输出格式(使

Cwillchris的博客 2734

ICE 协议概要

1、ICE协议由三部分组成:&lt;o:p&gt;&lt;/o:p&gt; 1)数据编码规范,用来进行各种数据类型的序列化。&lt;o:p&gt;&lt;/o:p&gt; 2)客户端与服务器端的交互的消息类型,以及在何种情况下应发出何种消息的规范。&lt;o:p&gt;&lt;/o:p&gt; 3)客户端与服务器端如何协商二者所用协议及编码版本的规范。&lt;o:p&gt;&lt;/o:p

firmgoal 1119

【ArcGIS遇上Python】ArcGIS10.8 Python代码批量完美实现MODIS NDVI数据格式转换和投影变换

由于论文的需要,将MODIS NDVI数据进行投影变换和格式转换,具体操作可以参照:《ArcGIS10.8完美实现MODIS NDVI数据格式转换和投影变换》,但是该文章中的做法只能一次性实现一景影像的转换,没法批量,虽然ArcGIS中提供了Batch的方法但是需要挨个添加数据,确定输出路径等等,本文就实现以ArcGIS10.8 Python代码批量完美实现MODIS NDVI数据格式转换和投影变换。先来看投影后的效果: 在实现批量投影转换之前,需要两个投影文件:Sinusoidal.prj和MyAl

智慧空间实验室 3815

WOFOST作物模型(1):PCSE环境配置

get_summary_output() 方法通常用于在 PCSE 模拟过程结束后,获取模拟结果的摘要信息,例如模拟期间的总产量、总水分需求等。它可以提供对模拟结果的快速总结,方便用户进行后续的分析和处理。用.get_output来获取过程参数,并将这些参数转为dataframe显示。用run_till_terminate()代表终止。安装好之后,打开jupyter notebook。也可以指定运行时间,并获取最后一天的参数。首先还是打开之前建好的gee虚拟环境。

所有专家都曾始于新手 681

ICE协议摘要

1、ICE协议由三部分组成:&lt;o:p&gt;&lt;/o:p&gt; 1)数据编码规范,用来进行各种数据类型的序列化。&lt;o:p&gt;&lt;/o:p&gt; 2)客户端与服务器端的交互的消息类型,以及在何种情况下应发出何种消息的规范。&lt;o:p&gt;&lt;/o:p&gt; 3)客户端与服务器端如何协商二者所用协议及编码版本的规范。&lt;o:p&gt;&lt;/

weixin_34034670的博客 207

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【转】ice介绍网上搜集整理

【转】ice介绍网上搜集整理 分类: ICE相关2011-04-06 16:081027人阅读评论(0)收藏举报 webservicefacet语言module网络协议idempotent 目录(?)[+] ICE的优点与WebService的对比一些基础的概念和模型ICE调用模式ICE的版本控制Facet持久化 Feeze服务装箱管理 ICEBox文件分发ICEPatc

junecauzhang的专栏 792

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

PHP的中间件

2010-11-01 21:42 PHP没有中间件,导致了对很多麻烦。比如,对数据库的操作必须要链接数据库,然后做SQL操作。WEB程序直接操作数据库的方法,这样会带来很多 人为因素的事故隐患,以及管理上的麻烦,尤其是对大型的网站应用来说。规范的模式应该是,WEB程序传递参数到一个服务程序上,由该服务程序进行判断并最 终操作数据库或者其它数据文件,这样做到了明确权限控制,和业

wxl1986622的专栏 7336

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

音视频开发实战路径:C++/Linux/FFmpeg/WebRTC四阶能力闭环

音视频开发是融合操作系统、网络协议、编解码与实时传输的复合型工程能力。其核心原理在于零拷贝内存管理、内核级IO调度、标准音视频数据结构建模,以及可定制化实时传输协议栈。技术价值体现在低延迟、高并发、硬件协同与跨平台稳定性,广泛应用于直播推流、远程协作、智能终端多媒体处理等场景。本文聚焦真实项目验证的进阶路径,以C++为底层语言基础,Linux为运行环境核心,FFmpeg为音视频数据解析与处理标准接口,WebRTC为实时交互协议骨架,构建从裸流解析到端到端文件秒传的完整能力闭环。

weixin_30500473的博客 352

Android Google XTS

GMS全称为Google Mobile Service,即谷歌移动服务。GMS是Google开发并推动Android的动力,是Google提供的Mobile Device上的一系列应用服务。

qq_27672101的博客 2188

二手胶片相机交易应用HarmonyOS ArkTS API 24 type 字段用联合类型 ‘sell‘ | ‘buy‘ 明确区分了在售单和求购单,两种类型在 UI 展示上会有不同的视觉样式

在移动互联网与智能穿戴设备高度普及的今天,"习惯养成"已经从一个模糊的自我管理理念,演变为一个可量化、可追踪、可视化的数字化产品赛道。越来越多的人希望借助手中的智能终端,把"早起、冥想、阅读、运动"这些抽象的自律行为,转化为一条条清晰的数据曲线和一张张可触摸的打卡卡片。而鸿蒙生态(HarmonyOS)凭借其跨设备协同、分布式软总线以及声明式 UI 开发框架 ArkUI,为这类注重"轻量化交互 + 即时反馈"的生活方式类应用提供了极为理想的生长土壤。本应用正是一款面向"晨间场景"深度打磨的习惯追踪工具。它聚焦

jin421352的博客 104

ICE简单介绍及使用示例

1、ICE是什么?  ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,使我们能够以最小的代价构建分布式应用程序。ICE使我们专注于应用逻辑的开发,它来处理所有底层的网络接口编程,这样我们就不用去考虑这样的细节:打开网络连接、网络数据传输的序列化与反序列化、连接失败的尝试次数

冯立彬的博客 8万+

ICE的slice定义注意事项

一、源文件规则 1、文件扩展名必须为.ice 2、在使用#include来包含其他的ice定义文件时,只能使用 3、每个slice定义文件中最好加上#ifndef的宏定义,防止文件的双重包含 4、文件必须是utf-8编码的 二、词法规则 1、slice文件支持c++的单行和多行注释 2、slice定义中的关键字均为小写 3、slice文件中关键字不能以下划线开始和结尾,当然

followshake的专栏 8954
上一篇: 自学ICE基础介绍
下一篇: Oracle 的drop table if exists功能
Colorado
博客等级 码龄19年 44粉丝 44原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值