package TAO_Helper; import java.net.*; import java.io.*; /** * This class implements the TAO service discovery protocol. * *
 
*   
* For example: *
 
* 
*	import TAO_Helper.*;
* 	NamingContext nc;
*       int two_k_name_server_port = 20000;
* 
* 	TAO_Helper tao_helper = new TAO_Helper(two_k_name_server_port);
* 
*	String ns_ior = tao_helper.resolve_initial_references("NameService");
* 
* 	obj1 = orb.string_to_object(ns_ior);
* 	nc = NamingContextHelper.narrow(obj1);
* 
*       ...
*
*   
* Source: TAO_Helper.java * * @version 1.0 06/25/99 * @author Tomonori Yamane * @since 1.0 */ public class TAO_Helper { static boolean debug = true; /** * Default Constructor. * Default multicast port for NameService = 10013. * Default multicast port for TraderService = 10016. */ public TAO_Helper() {} /** * Constructor with the specified name server port number. * * 2K group's persistent name server uses port = 200000. */ public TAO_Helper(int name_port) { TAO_DEFAULT_NAME_SERVER_REQUEST_PORT = name_port; } /** * Constructor with command line arguments. * We can specify the options. * We have -ORBnameserviceport and -ORBtradingserviceport */ public TAO_Helper(String args[]) { parse_args(args); } // // parse_argments to specify port number // void parse_args(String args[]) { for (int i = 0 ; i < (args.length - 1); i++) { if (debug) System.out.println("arg " + i + " " + args[i]); if (args[i].compareTo("-ORBnameserviceport")==0) { TAO_DEFAULT_NAME_SERVER_REQUEST_PORT = Integer.parseInt(args[i+1]); i++; continue; } else if (args[i].compareTo("-ORBnameserviceior")==0) { // Specify NamingService IOR System.out.println("-ORBnameserviceior Not implemented yet"); i++; continue; } else if (args[i].compareTo("-ORBtradingserviceport")==0) { TAO_DEFAULT_TRADING_SERVER_REQUEST_PORT = Integer.parseInt(args[i+1]); i++; continue; } else if (args[i].compareTo("-ORBtradingserviceior")==0) { // Specify TradingService IOR System.out.println("-ORBtradingserviceior Not implemented yet"); i++; continue; } } } /** Resolve initial reference for the old TAO (0.3) @param name Name of the service. "NameService" or "TraderService" @return Stringified IOR for the specified TAO service */ public String resolve_old_initial_references(String name) { int port = 0; int serviceid = 0; String ior; // // Parse command line option // if (name.compareTo(TAO_OBJID_NAMESERVICE) == 0) { if (debug) System.out.println("Looking for NameService"); port = TAO_DEFAULT_NAME_SERVER_REQUEST_PORT; serviceid = TAO_SERVICEID_NAMESERVICE; } else if (name.compareTo(TAO_OBJID_TRADINGSERVICE) == 0) { if (debug) System.out.println("Looking for TradingService"); port = TAO_DEFAULT_TRADING_SERVER_REQUEST_PORT; serviceid = TAO_SERVICEID_TRADINGSERVICE; } else { if (debug) System.out.println("What's this? : " + name); return null; } try { InetAddress group = InetAddress.getByName(ACE_DEFAULT_MULTICAST_ADDR); MulticastSocket snd_sock = new MulticastSocket(port); if (debug) System.out.println("Multicast socket opened"); snd_sock.joinGroup(group); if (debug) System.out.println("Multicast joingroup"); DatagramSocket recv_sock = new DatagramSocket(); int recv_port = recv_sock.getLocalPort(); recv_sock.setSoTimeout(1 * 1000); // Timeout set to 1 sec byte[] mcast_info = new byte[4]; // packet (internet byte order) // // struct // { // u_short reply_port; // CORBA::Short service_id; // } mcast_info; mcast_info[0] = (byte)(recv_port >> 8); mcast_info[1] = (byte)(recv_port & 255); mcast_info[2] = (byte)(serviceid >> 8); mcast_info[3] = (byte)(serviceid & 255); if (debug) System.out.println("mcast_info created " + mcast_info.length); DatagramPacket snd = new DatagramPacket(mcast_info, 4, group, port); if (debug) System.out.println("Multicast data packet created"); snd_sock.send(snd); if (debug) System.out.println("Multicast data sent"); byte[] rbuf = new byte[ACE_MAX_DGRAM_SIZ]; DatagramPacket recv = new DatagramPacket(rbuf, rbuf.length); recv_sock.receive(recv); if (debug) System.out.println("Reply received"); snd_sock.leaveGroup(group); // Close sokets snd_sock.close(); recv_sock.close(); ior = new String(rbuf); if (debug) System.out.println("ior.length = " + ior.length()); // We need to trim the string ior = ior.trim(); if (debug) System.out.println("trimed ior.length = " + ior.length()); System.err.println("IOR = " + ior); if (debug) System.err.println("******************"); } catch(java.io.InterruptedIOException iioe) { System.err.println("multicast query time out"); iioe.printStackTrace(System.err); return null; } catch (Exception e) { System.err.println("tao_resolve_initial_references() failed"); e.printStackTrace(System.err); return null; } return ior; } /** Resolve initial reference. @param name Name of the service. "NameService" or "TraderService" @return Stringified IOR for the specified TAO service */ public String resolve_initial_references(String name) { int port = 0; int serviceid = 0; String ior; // // Parse command line option // if (name.compareTo(TAO_OBJID_NAMESERVICE) == 0) { if (debug) System.out.println("Looking for NameService"); port = TAO_DEFAULT_NAME_SERVER_REQUEST_PORT; serviceid = TAO_SERVICEID_NAMESERVICE; } else if (name.compareTo(TAO_OBJID_TRADINGSERVICE) == 0) { if (debug) System.out.println("Looking for TradingService"); port = TAO_DEFAULT_TRADING_SERVER_REQUEST_PORT; serviceid = TAO_SERVICEID_TRADINGSERVICE; } else { if (debug) System.out.println("What's this? : " + name); return null; } try { InetAddress group = InetAddress.getByName(ACE_DEFAULT_MULTICAST_ADDR); MulticastSocket snd_sock = new MulticastSocket(port); if (debug) System.out.println("Multicast socket opened"); snd_sock.joinGroup(group); if (debug) System.out.println("Multicast joingroup"); // DatagramSocket recv_sock = new DatagramSocket(); ServerSocket recv_sock = new ServerSocket(0); int recv_port = recv_sock.getLocalPort(); recv_sock.setSoTimeout(3 * 1000); // Timeout set to 3 sec // packet (internet byte order) // // struct // { // u_short reply_port; // UDP port // CORBA::Short service_id; // } mcast_info; // New packet (internet byte order) // // struct // { // short header ---- size of data // u_short reply_port; // TCP port // CORBA::String service_id; ---- null terminated // } mcast_info; ByteArrayOutputStream msg = new ByteArrayOutputStream(); int dataLength = name.length() + 3; msg.write((dataLength >> 8) & 0xff); msg.write(dataLength & 0xff); msg.write((recv_port >> 8) & 0xff); msg.write(recv_port & 0xff); msg.write(name.getBytes()); msg.write(0); // byte[] mcast_info = new byte[4]; // // mcast_info[0] = (byte)(recv_port >> 8); // mcast_info[1] = (byte)(recv_port & 255); // mcast_info[2] = (byte)(serviceid >> 8); // mcast_info[3] = (byte)(serviceid & 255); // if (debug) System.out.println("mcast_info created " + mcast_info.length); // DatagramPacket snd = new DatagramPacket(mcast_info, 4, group, port); DatagramPacket snd = new DatagramPacket(msg.toByteArray(), msg.size(), group, port); if (debug) System.out.println("Multicast data packet created"); snd_sock.send(snd); if (debug) System.out.println("Multicast data sent"); Socket accepted_sock = recv_sock.accept(); // For TCP port, this blocks byte[] rbuf = new byte[ACE_MAX_DGRAM_SIZ]; // DatagramPacket recv = new DatagramPacket(rbuf, rbuf.length); // // recv_sock.receive(recv); InputStream in = accepted_sock.getInputStream(); int length; // skip data length part in.read(); in.read(); for (length = 0; length < rbuf.length; length++) { if ((rbuf[length] = (byte) in.read()) == 0) { break; } } ////// if (debug) System.out.println("Reply received"); snd_sock.leaveGroup(group); // Close sokets snd_sock.close(); recv_sock.close(); ior = new String(rbuf); if (debug) System.out.println("ior.length = " + ior.length()); // We need to trim the string ior = ior.trim(); if (debug) System.out.println("trimed ior.length = " + ior.length()); System.err.println("IOR = " + ior); if (debug) System.err.println("******************"); } catch(java.io.InterruptedIOException iioe) { System.err.println("multicast query time out"); iioe.printStackTrace(System.err); return null; } catch (Exception e) { System.err.println("tao_resolve_initial_references() failed"); e.printStackTrace(System.err); return null; } return ior; } // // tao/orbconf.h // Default UDP multicast port number for locating TAO services // // 2K group's persistent name server uses port = 200000 // /** Default multicast port for locating NameService. */ static int TAO_DEFAULT_NAME_SERVER_REQUEST_PORT = 10013; /** Default multicast port for locating TraderService. */ static int TAO_DEFAULT_TRADING_SERVER_REQUEST_PORT = 10016; // tao/ORB.h static String TAO_OBJID_NAMESERVICE = "NameService"; static String TAO_OBJID_TRADINGSERVICE = "TradingService"; static String TAO_OBJID_ROOTPOA = "RootPOA"; static String TAO_DEFAULT_ROOTPOA_NAME = "TradingService"; static String TAO_OBJID_POACURRENT = "POACurrent"; static String TAO_OBJID_INTERFACEREP = "InterfaceRepository"; static short TAO_SERVICEID_NAMESERVICE = 0; static short TAO_SERVICEID_TRADINGSERVICE = 1; // ace/OS.h /** Multicast address for TAO (ACE). */ static String ACE_DEFAULT_MULTICAST_ADDR = "224.9.9.2"; static int ACE_MAX_DGRAM_SIZ = 8192; }