The Ice Framework
Guides, examples, and reference for building distributed applications with Ice.
Ice is a complete RPC framework that helps you build networked applications with minimal effort.
- Ice does the networking. It takes care of opening network connections, serializing and deserializing data for network transmission, and retrying failed connection attempts, so you can focus on your application logic.
- Start with the Greeter Example. Writing a client-server application with Ice does not take much code. See for yourself!
Greeter.ice
module VisitorCenter{ /// Represents a simple greeter. interface Greeter { /// Creates a personalized greeting. string greet(string name); }}Ice::CommunicatorPtr communicator = Ice::initialize(argc, argv);Ice::CommunicatorHolder holder{communicator};
VisitorCenter::GreeterPrx greeter{ communicator, "greeter:tcp -h localhost -p 4061"};
string greeting = greeter.greet("alice");cout << greeting << endl;Greeter.ice
module VisitorCenter{ /// Represents a simple greeter. interface Greeter { /// Creates a personalized greeting. ["cs:identifier:Greet"] string greet(string name); }}await using var communicator = new Ice.Communicator(ref args);
GreeterPrx greeter = GreeterPrxHelper.createProxy( communicator, "greeter:tcp -h localhost -p 4061");
string greeting = await greeter.GreetAsync("alice");Console.WriteLine(greeting);Greeter.ice
["java:identifier:com.example.visitorcenter"]module VisitorCenter{ /// Represents a simple greeter. interface Greeter { /// Creates a personalized greeting. string greet(string name); }}try (var communicator = new Communicator(args)) { var greeter = GreeterPrx.createProxy( communicator, "greeter:tcp -h localhost -p 4061");
String greeting = greeter.greet("alice"); System.out.println(greeting);}Greeter.ice
module VisitorCenter{ /// Represents a simple greeter. interface Greeter { /// Creates a personalized greeting. string greet(string name); }}client.js
await using communicator = new Ice.Communicator(process.argv);
const greeter = new VisitorCenter.GreeterPrx( communicator, "greeter:tcp -h localhost -p 4061");
const greeting = await greeter.greet("alice");console.log(greeting);Greeter.ice
["matlab:identifier:visitorcenter"]module VisitorCenter{ /// Represents a simple greeter. interface Greeter { /// Creates a personalized greeting. string greet(string name); }}client.m
communicator = Ice.Communicator(args);cleanup = onCleanup(@() communicator.destroy());
greeter = visitorcenter.GreeterPrx( ... communicator, ... 'greeter:tcp -h localhost -p 4061');
greeting = greeter.greet('alice');fprintf('%s\n', greeting);Greeter.ice
module VisitorCenter{ /// Represents a simple greeter. interface Greeter { /// Creates a personalized greeting. string greet(string name); }}Client.php
$communicator = Ice\initialize($argv);
$greeter = VisitorCenter\GreeterPrxHelper::createProxy( $communicator, 'greeter:tcp -h localhost -p 4061');
$greeting = $greeter->greet("alice");echo "$greeting\n";Greeter.ice
module VisitorCenter{ /// Represents a simple greeter. interface Greeter { /// Creates a personalized greeting. string greet(string name); }}async with Ice.Communicator( sys.argv, eventLoop=asyncio.get_running_loop()) as communicator: greeter = VisitorCenter.GreeterPrx( communicator, "greeter:tcp -h localhost -p 4061")
greeting = await greeter.greetAsync("alice") print(greeting)Greeter.ice
module VisitorCenter{ /// Represents a simple greeter. interface Greeter { /// Creates a personalized greeting. string greet(string name); }}client.rb
Ice::initialize(ARGV) do |communicator| greeter = VisitorCenter::GreeterPrx.new( communicator, "greeter:tcp -h localhost -p 4061")
greeting = greeter.greet("alice") puts greetingendGreeter.ice
module VisitorCenter{ /// Represents a simple greeter. interface Greeter { /// Creates a personalized greeting. string greet(string name); }}var args = CommandLine.argumentslet communicator = try Ice.initialize(&args)defer { communicator.destroy() }
let greeter = try makeProxy( communicator: communicator, proxyString: "greeter:tcp -h localhost -p 4061", type: GreeterPrx.self)
let greeting = try await greeter.greet("alice")print(greeting)Explore the Documentation
The main chapters. Every chapter is in the table of contents; to find any page by name, use the search box in the top bar or press Ctrl+K, or ⌘K on macOS.
Greeter Example
Write a client and a server, step by step, in your language.
Basics
Clients and servers, Slice, the Ice protocol, and the Ice services, in brief.
The Slice Language
Define the interfaces, operations, and data types your clients and servers share.
The Ice Runtime
Communicators, proxies, object adapters, connections, and dispatch.
Ice Services
IceGrid, IceStorm, Glacier2, IceBox, IceBridge, and DataStorm.
Property Reference
Every property the Ice runtime and its services understand.
Releases
- Ice 3.8.3Release notesSupported platformsSeptember 10, 2026
- Ice 3.8.2Release notesSupported platformsJune 4, 2026
- Ice 3.8.1Release notesSupported platformsMarch 3, 2026
- Ice 3.8.0Release notesSupported platformsDecember 17, 2025
- Upgrade Guide: moving an application from Ice 3.7 to Ice 3.8.
- Backward Compatibility of Ice Versions: what a patch, minor, or major release keeps compatible.
Beyond the Documentation
- API reference for C++, C#, Java, JavaScript, PHP, Python, Ruby, and Swift, plus the Slice definitions that ship with Ice.
- Demos on GitHub: sample programs for every language mapping.
- Ice on GitHub: source code, issue tracker, and the changelog of each release.
- IceRPC: ZeroC's new RPC framework. See Using Ice and IceRPC Together.