pushcacheprotocol.java

来自「很棒的web服务器源代码」· Java 代码 · 共 263 行

JAVA
263
字号
// PushCacheProtocol.java// $Id: PushCacheProtocol.java,v 1.1 2001/10/03 15:00:46 ylafon Exp $// (c) COPYRIGHT MIT, INRIA and Keio, 2001.// Please first read the full copyright statement in file COPYRIGHT.htmlpackage org.w3c.www.protocol.http.cache.push;import java.io.DataOutputStream;import java.io.ByteArrayOutputStream;import java.util.TreeMap;/** * PushCacheProtocol * Characteristics of the protocol used to control the push cache, and  * methods for common operations * <p> * <b>Protocol Description</b> * <p> * To request that "/home/abc/page.html" is inserted in cache as  * "http://www.abc.com/page.html" the client sends a packet with * command="ADD", and remain_len set to sizeof(add_packet_t) plus * the sum of the lengths of the path and the urls including their * null terminators.  The client then sends an add_packet describing * the lengths of the two strings followed by the path and then the * url. * <p> * The server replies with either command="OK" and remain_len=0 or * command="ERR" and remain_len set the the length of the error * string that follows immediately.  In the event of an "ERR" message * the connection is closed by the server. * <p> * To request that the page associated with "http://www.abc.com/page.html" * be removed from the cache the client sends a packet with command="DEL", * and remain_len set to sizeof(int) plus the length of the url string * including the trailing null character.  The server replies as with * ADD above.  Attempting to remove a url that is not present in the cache * results in an "OK" packet being returned, the cache is unchanged. * <p> * The client can ask if a url is present in the cache by sending a packet * with command="PRS", and url information as with the DEL command.  The * server will reply with "OK" if the url is present, "NO" if the url is * not present and "ERR" if an error was encountered. * <p> * The client can request that the cache be emptied of all urls by sending * a packet with command="CLN" (clean).  The remain_len field is set to zero. * The server will reply with either OK or ERR. *  * <p> * The client can terminate the dialogue by sending a command="BYE"  * packet and then closing the connection. *  * <p> * 'C' code describing the packet structures are shown below * * *<pre> * typedef struct { *                             // Bytes  Notes *                             // -----  ----- *       char  tag[4];         // 0-3    = {'P','C','P','P'} *       short major_version;  // 4-5    = 1 *       short minor_version;  // 6-7    = 1 *       char  command[4];     // 8-11   Null terminated command string  *       int   remain_len;     // 12-15  number of remaining bytes to read * } packet_t; * * typedef struct { *       int   path_len;       // 4      Length of pathname (including null) *       int   url_len;        // 8      Length of URL (including null) * } add_packet_t; *  * Note that the command is always 4 characters in length and that the * null characters are considered part of the command, so in Java (but * not C) we must include the \0 when comparing strings: *   "ADD\0", "BYE\0", "OK\0\0", "ERR\0", "CLN\0", "PRS\0", "DEL\0" * * </pre> * * @author Paul Henshaw, The Fantastic Corporation, Paul.Henshaw@fantastic.com * @version $Revision: 1.1 $ * $Id: PushCacheProtocol.java,v 1.1 2001/10/03 15:00:46 ylafon Exp $ */public class PushCacheProtocol {    /*     * Protocol characteristics     */    /**     * Size of basic packet in bytes     */    public final static int   PACKET_LEN=16;    /**     * Size of command string in bytes (including null terminator)     */    public final static int   COMMAND_LEN=4;    /**     * Combined size of tag and version information     */    public final static int   HEADER_LEN=8;    /**     * Size of packet tag     */    public final static int   TAG_LEN=4;        /**     * Maximum size of strings (urls, paths, error messages)     */    public final static int   MAX_STRING_LEN=1024;    /**     * Maximum size of payload (follows basic packet)     */    public final static int   MAX_PAYLOAD_LEN=8192;    /**     * Protocol Major version     */    public final static short MAJ_PROTO_VERSION=1;    /**     * Protocol minor version     */    public final static short MIN_PROTO_VERSION=2;    /**     * Numeric codes for commands,      */    public static final int NO_SUCH_COMMAND=-1, 	ERR=0, ADD=1, DEL=2, CLN=3, PRS=4, BYE=5, OK=6, NO=7, NOP=8;    private static PushCacheProtocol _instance;    private TreeMap _map;    private byte[] _ok_packet_bytes=null;    private byte[] _no_packet_bytes=null;    private byte[] _err_packet_bytes=null;    private byte[] _header=null;    /**     * Access to single instance of this class     */    public static PushCacheProtocol instance() {	if(_instance==null) {	    _instance=new PushCacheProtocol();	}	return _instance;    }        /**     * Utility function for command string parsing     */    public int parseCommand(String command) {	Integer in=(Integer)_map.get(command);	if(in==null) {	    return NO_SUCH_COMMAND;	}	return(in.intValue());    }    /**     * Byte array for OK packet     */    public byte[] okPacket() {	return(_ok_packet_bytes);    }    /**     * Byte array for NO packet     */    public byte[] noPacket() {	return(_no_packet_bytes);    }    public byte[] header() {	return(_header);    }    /**     * Create error packet for specified error message     */    public byte[] errorPacket(String message) {	try {	    java.io.ByteArrayOutputStream baos=		new java.io.ByteArrayOutputStream(16);	    DataOutputStream dos=new 		DataOutputStream(baos);		    	    dos.write(_header,0,_header.length);	    dos.writeBytes("ERR\0");	    dos.writeInt(message.length());	    dos.writeBytes(message);	    return baos.toByteArray();	}	catch(Exception e) {	    e.printStackTrace();	}	return(null);    }    /**     * True iff first four bytes of packet are identical to the protocol tag     */    public boolean isValidProtocolTag(byte[] packet) {	return(packet[0]==(byte)'P' && packet[1]==(byte)'C' || 	       packet[2]==(byte)'P' && packet[3]==(byte)'P');    }    /**     * Singleton, no public constructor, use {@link #instance}     * @see #instance     */     protected PushCacheProtocol() {	try {	    _map=new TreeMap();	    _map.put("ERR\0",new Integer(ERR));	    _map.put("ADD\0",new Integer(ADD));	    _map.put("DEL\0",new Integer(DEL));	    _map.put("CLN\0",new Integer(CLN));	    _map.put("PRS\0",new Integer(PRS));	    _map.put("BYE\0",new Integer(BYE));	    _map.put("OK\0\0",new Integer(OK));	    _map.put("NO\0\0",new Integer(NO));	    _map.put("NOP\0",new Integer(NOP));	    ByteArrayOutputStream baos=new ByteArrayOutputStream(PACKET_LEN);	    DataOutputStream dos=new DataOutputStream(baos);	    dos.writeByte('P');	    dos.writeByte('C');	    dos.writeByte('P');	    dos.writeByte('P');	    dos.writeShort(MAJ_PROTO_VERSION);	    dos.writeShort(MIN_PROTO_VERSION);	    _header=baos.toByteArray();	    baos=new ByteArrayOutputStream(PACKET_LEN);	    dos=new DataOutputStream(baos);	    	    dos.write(_header,0,_header.length);	    dos.writeBytes("OK\0\0");	    dos.writeInt(0);	    _ok_packet_bytes=baos.toByteArray();	    baos=null;	    dos=null;	    baos=new ByteArrayOutputStream(PACKET_LEN);	    dos=new DataOutputStream(baos);	    dos.write(_header,0,_header.length);	    dos.writeBytes("NO\0\0");	    dos.writeInt(0);	    _no_packet_bytes=baos.toByteArray();	}	catch(Exception e) {	    e.printStackTrace();	}    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?