/*
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* -Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* -Redistribution in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* Neither the name of Oracle nor the names of
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any
* kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
* WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
* EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
* NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
* USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
* ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT,
* SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF
* THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that Software is not designed, licensed or
* intended for use in the design, construction, operation or
* maintenance of any nuclear facility.
*/
package example.inetd;
import java.io.IOException;
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
* Used to launch a server from inetd
. The main
* method of this server implementation exports the service object (an
* instance of ServiceInterface
) and then uses the utility
* method InitializeRegistry.initializeWithInheritedChannel
to
* create and export a registry using an inherited channel (if any) and
* to bind a name to the service proxy in that registry for clients to look
* up.
*
*
This program, when configured to be started from inetd
,
* will start the server when a client attempts to look up the server by
* name in the registry on the port configured with inetd
.
*
*
To configure inetd
to launch this program, the following
* entry should be added to the configuration file
* /etc/inetd.conf
:
*
*
* example-server stream tcp wait nobody jrehome/bin/java \ * java -classpath classpath example.inetd.Server ** where jrehome is the path to the installed JRE, and * classpath is the class path for the example. * *
Additionally, the example-server
name needs to be
* configured as a service in the /etc/services
file as
* follows:
*
*
* example-server port/tcp ** where port is the port the registry will accept requests * on. Note that the service name-- * here we used
example-server
-- can be another name, as long
* as the chosen name it is not already configured in /etc/services.
*
* This program also supports being run from the command line. In this * case, there is no inherited channel, and the program will simply * create/export a remote service, create/export a registry on the port * number supplied as the command line argument, and then bind the * service's proxy in the registry for clients to look up. *
This program can be run from the command line as follows: * *
* java example.inetd.Server port ** where port is a nonzero port that the registry accepts * requests on. **/ public class Server implements ServiceInterface { public Server() {} public String sendMessage(String message) { System.out.println(message); return "received message: " + message; } public static void main(String[] args) { /* * Redirect System.err output to a file. */ redirectErrorOutput(); /* * Parse port argument. */ int port = 0; if (args.length > 0) { try { port = Integer.parseInt(args[0]); } catch (NumberFormatException e) { goodbye("malformed port argument", e); } } /* * Create and export service, and then bind in local registry using * inherited channel, if any. */ ServiceInterface server = new Server(); Remote proxy = null; try { /* * Use two argument exportObject method to make sure that * dynamic proxy can be used. */ proxy = UnicastRemoteObject.exportObject(server, 0); } catch (RemoteException e) { goodbye("exception exporting service", e); } try { InitializeRegistry.initializeWithInheritedChannel( proxy, "ServiceInterface", port); } catch (IllegalArgumentException e) { goodbye("invalid port argument", e); } catch (Exception e) { goodbye("exception occurred", e); } System.err.println("ready"); /* * Wait forever. */ try { Thread.sleep(Long.MAX_VALUE); } catch (InterruptedException e) { throw new AssertionError(e); } } /** * Redirects System.err output to a file. */ private static void redirectErrorOutput() { try { File file = File.createTempFile("example-server-err", null, null); PrintStream errStream = new PrintStream(new FileOutputStream(file)); System.setErr(errStream); } catch (IOException e) { goodbye("exception setting up error output file", e); } } /** * Prints message and exception, then exits. */ private static void goodbye(String message, Exception e) { System.err.println("Server: " + message + ": "); e.printStackTrace(); System.exit(1); } }