Initially I was planning a light walkthrough here of building a client in each environment to match up with the server code. But this code is even less interesting than our server code. This unfortunately undoes the "surprise ending" I had planned: writing three clients in each environment, one to attach to each server.
That's the thing: You can write a client in C# that will attach to a Web service written in Java (or Delphi, or C++, or whatever). You can write a Java client that will attach to the C# server. Either will attach to the Delphi server, and the Delphi client can access the other servers. And there's no change in the code! The only change is in the environment; that is, where you tell the client to look for the service, or what name you give the service. If we named all three services the same thing and switched them on and off at random, the client would never know. So, at this level, the Java versus .NET issue is pointless. You don't need either.