public DictionaryServiceImpl(string port, string nextServerAddress)
    {
        _myHash   = HashString(port);
        _nextHash = HashString(nextServerAddress.Split(':')[1]);
        Console.WriteLine($"Connecting to next server {nextServerAddress}");
        var channel = new Channel(nextServerAddress, ChannelCredentials.Insecure);

        _nextClient = new DictionaryService.DictionaryServiceClient(channel);
        _myAddr     = port;
    }
    public static int Main(string[] args)
    {
        if (args.Length < 1)
        {
            Console.WriteLine("Usage: dotnet client.dll {PORT}");
            return(-1);
        }
        int port;

        if (!int.TryParse(args[0], out port))
        {
            Console.WriteLine("invalid format for port, use a number");
            return(-1);
        }
        try {
            var channel     = new Channel($"127.0.0.1:{port}", ChannelCredentials.Insecure);
            var client      = new DictionaryService.DictionaryServiceClient(channel);
            var callOptions = new CallOptions(deadline: DateTime.UtcNow.Add(TimeSpan.FromSeconds(3)));

            // Set key
            var setRequest = new SetRequest {
                Key = "foo", Value = "bar"
            };
            var setResponse = client.Set(setRequest, callOptions);
            Console.WriteLine($"setRequest={setRequest}");
            Console.WriteLine($"setResponse={setResponse}");

            // Retrieve key
            var getRequest = new GetRequest {
                Key = "foo"
            };
            var getResponse = client.Get(getRequest, callOptions);
            Console.WriteLine($"getRequest={getRequest}");
            Console.WriteLine($"getResponse={getResponse}");
            channel.ShutdownAsync().Wait();
            Console.WriteLine("\nGRPC client exiting");
        } catch (Exception e) {
            Console.WriteLine($"There was an error: {e.Message}");
            return(-1);
        }
        return(0);
    }