nameproxy.java
来自「java版ace,java程序员值得一看」· Java 代码 · 共 406 行
JAVA
406 行
/************************************************* * * = PACKAGE * netsvcs.Naming * * = FILENAME * NameProxy.java * *************************************************/package JACE.netsvcs.Naming;import java.io.*;import java.net.*;import java.util.*;import JACE.OS.*;import JACE.SOCK_SAP.*;import JACE.Connection.*;/** * Proxy which clients can use to interact with the naming service. * Can be used with the Connector. * *@see JACE.Connection.Connector *@see NameAcceptor *@see NameHandler * *@author Everett Anderson */public class NameProxy extends SvcHandler{ /** * Constructor, connects itself using a Connector. * *@param host name of the host of the naming service *@param port port to connect to on the host */ public NameProxy (String host, int port) throws UnknownHostException, SocketException, InstantiationException, IllegalAccessException, IOException { Connector c = new Connector (); c.open (host, port); c.connect (this); } /** * Default constructor. Proxies created with this constructor must * be connected to use. */ public NameProxy () { } /** * Constructor taking a SOCKStream to use. * *@param sock SOCKStream already open to the naming service */ public NameProxy (SOCKStream sock) { this.stream_ = sock; } /** * Initialize this proxy. (Called by Connector) */ public int open (Object obj) { connected_ = true; return 0; } /** * Close the proxy, shutting down the connection to the service. */ public int close () { if (!connected_) return 0; try { this.peer ().close (); } catch (IOException e) { return -1; } finally { connected_ = false; } return 0; } /** * Attempt to bind the given data pair * @param name Name/key * @param value Value to bind * * @return True iff bind is successful */ public boolean bind(String name, String value) throws IOException { return this.bind(name, value, null, false); } /** * Attempt to bind the given data triplet * @param name Name/key * @param value Value to bind * @param type Type to bind (another string) * * @return True iff the bind was successful */ public boolean bind(String name, String value, String type) throws IOException { return this.bind(name, value, type, false); } /** * The most generic of the bind methods. Allows factoring out of * common code. Not public. */ boolean bind (String name, String value, String type, boolean rebind) throws IOException { // Create a new NameRequest with the desired info NameRequest request = new NameRequest(rebind ? NameRequest.REBIND : NameRequest.BIND, name, value, type, null); // Send it to the naming service request.streamOutTo(this.stream_); // Create a reply NameReply reply = new NameReply(); // Get the status of the bind from the naming service reply.streamInFrom(this.stream_); // Return true on success return (reply.type() == NameReply.SUCCESS ? true : false); } /** * Rebind a name and a value * @param name Name/key * @param value Bound value * * @return True if the rebind was successful */ public boolean rebind (String name, String value) throws IOException { return this.bind(name, value, null, true); } /** * Rebind a name, value, and type * @param name Name/key * @param value Bound value * @param type Bound type * * @return True if rebind was successful */ public boolean rebind (String name, String value, String type) throws IOException { return this.bind(name, value, type, true); } /** * Look up information bound to the given key/name. * * @param name Name/key * * @return Vector with three elements: * 0 Name/key * 1 Value * 2 Type */ public Vector resolve (String name) throws IOException { // Create a new NameRequest with the name & request type NameRequest request = new NameRequest(NameRequest.RESOLVE, name, null, null, null); // Send it to the naming service request.streamOutTo(this.stream_); // Get a response (hopefully with the value and type) request.streamInFrom(this.stream_); // Dump the result into a vector Vector result = new Vector(); result.addElement(request.name()); result.addElement(request.value()); result.addElement(request.type()); // Cut it down to the size we need result.trimToSize(); return result; } /** * Remove the entry in the mapping corresponding to the given name/key. * * @param name Name/key * * @return True if the unbind was successful */ public boolean unbind (String name) throws IOException { NameRequest request = new NameRequest(NameRequest.UNBIND, name, null, null, null); // Send the request to the naming service request.streamOutTo(this.stream_); NameReply reply = new NameReply(); // Get reply reply.streamInFrom(this.stream_); return (reply.type() == NameReply.SUCCESS ? true : false); } /** * Return a vector that's a list of names (Strings) that begin with * the given pattern * @param pattern Search pattern * @return Vector List of names */ public Vector listNames (String pattern) throws IOException { return this.requestSimpleList(pattern, NameRequest.LIST_NAMES); } /** * Return a vector that's a list of types (Strings) that begin with * the given pattern * @param pattern Search pattern * @return Vector List of types */ public Vector listTypes (String pattern) throws IOException { return this.requestSimpleList(pattern, NameRequest.LIST_TYPES); } /** * Return a vector that's a list of values (Strings) that begin with * the given pattern * @param pattern Search pattern * @return Vector List of values */ public Vector listValues (String pattern) throws IOException { return this.requestSimpleList(pattern, NameRequest.LIST_VALUES); } /** * Non-public generic list gathering method */ Vector requestSimpleList (String pattern, int type) throws IOException { // Make request for a list of the given type NameRequest request = new NameRequest(type, pattern, null, null, null); request.streamOutTo(this.stream_); // Allocate and reuse the DIS here rather than each time we call // streamInFrom DataInputStream dis = new DataInputStream(this.stream_.inputStream()); request.streamInFrom(dis); Vector result = new Vector(); // Add elements until there's a null message with the MAX_ENUM // request type while (request.requestType() != NameRequest.MAX_ENUM) { if (type == NameRequest.LIST_NAMES) result.addElement(new String(request.name())); else if (type == NameRequest.LIST_VALUES) result.addElement(new String(request.value())); else result.addElement(new String(request.type())); request.streamInFrom(dis); } // Adjust the vector to the minimal size result.trimToSize(); return result; } /** * Get a vector with the entire data set for entries whose name begins with * the given pattern. Each element in the vector is another vector * with the following layout: * 0 Name/key * 1 Value * 2 Type * * @param pattern Search pattern * @return Vector of vectors */ public Vector listNameEntries (String pattern) throws IOException { return this.requestComplexList(pattern, NameRequest.LIST_NAME_ENTRIES); } /** * Get a vector with the entire data set for entries whose value begins with * the given pattern. Each element in the vector is another vector * with the following layout: * 0 Name/key * 1 Value * 2 Type * * @param pattern Search pattern * @return Vector of vectors */ public Vector listValueEntries (String pattern) throws IOException { return this.requestComplexList(pattern, NameRequest.LIST_VALUE_ENTRIES); } /** * Get a vector with the entire data set for entries whose type begins with * the given pattern. Each element in the vector is another vector * with the following layout: * 0 Name/key * 1 Value * 2 Type * * @param pattern Search pattern * @return Vector of vectors */ public Vector listTypeEntries (String pattern) throws IOException { return this.requestComplexList(pattern, NameRequest.LIST_TYPE_ENTRIES); } /** * Non-public generic method for getting a a vector of vectors with the * entire data set for entries fitting the given pattern. */ Vector requestComplexList (String pattern, int type) throws IOException { // Create request with desired type NameRequest request = new NameRequest(type, pattern, null, null, null); // Send it to the naming service request.streamOutTo(this.stream_); // Allocate the DIS here and reuse DataInputStream dis = new DataInputStream(this.stream_.inputStream()); // Get the first response request.streamInFrom(dis); Vector result = new Vector(); // Loop while we don't see a null response with the MAX_ENUM //request type while (request.requestType() != NameRequest.MAX_ENUM) { Vector entry = new Vector(); // Create an element in the main vector entry.addElement(request.name()); entry.addElement(request.value()); entry.addElement(request.type()); entry.trimToSize(); // Add it to the result result.addElement(entry); // Get another NameRequest request.streamInFrom(dis); } result.trimToSize(); return result; } private boolean connected_ = false;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?