icpmessage.java

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

JAVA
191
字号
// ICPMessage.java// $Id: ICPMessage.java,v 1.5 2000/08/16 21:38:04 ylafon Exp $// (c) COPYRIGHT MIT and INRIA, 1996.// please first read the full copyright statement in file COPYRIGHT.HTMLpackage org.w3c.www.protocol.http.icp;import java.net.DatagramPacket;import java.net.InetAddress;import java.net.URL;class ICPMessage implements ICP {    /**     * The ICP opcde for that message.     */    protected int opcode = -1;    /**     * The ICP major version of the message.     */    protected int version = -1;    /**     * The identifier of the message.     */    protected int id = -1;    /**     * The options for this message.     */    protected int options = 0;    /**     * The InetAddress of the sender or <strong>null</strong> otherwise.     */    protected InetAddress addr = null;    /**     * The port number of the sender of that message, or <strong>-1</strong>     * if that message was created locally.     */    protected int port = -1;    /**     * The URL of the message.     */    URL url = null;    /**     * Parse the given datagram into an ICP message.     * @exception ICPProtocolException If that reply doesn't conform to ICP      * protocol.     */    protected static ICPMessage parse(DatagramPacket p)	throws ICPProtocolException    {	byte buf[] = p.getData();	int  len   = p.getLength();	if ( len < 4 ) 	    throw new ICPProtocolException("Invalid ICP datagram length");	InetAddress addr    = p.getAddress();	int         port    = p.getPort();	// Decode the first word:	int         opcode  = buf[0];	int         version = buf[1];	int plen = (((buf[2] & 0xff) << 8)+(buf[3] & 0xff));	if ( plen != len )	    throw new ICPProtocolException("Didn't got full message: "					   + len + "/" + plen);	// Construct an appropriate message:	ICPMessage msg = null;	switch(opcode) {	  case ICP_OP_QUERY:	      msg = new ICPQuery(addr, port, opcode, version, buf, 4, len);	      break;	  case ICP_OP_HIT:	  case ICP_OP_MISS:	      msg = new ICPReply(addr, port, opcode, version, buf, 4, len);	      break;	  default:	      throw new ICPProtocolException("Unsupported opcode: "+opcode);	}	return msg;    }    protected int parse(byte buf[], int off, int len) 	throws ICPProtocolException    {	// Decode the request identifier:	this.id      = (  ((buf[off]   & 0xff) << 24)			+ ((buf[off+1] & 0xff) << 16)			+ ((buf[off+2] & 0xff) << 8)			+ ((buf[off+3] & 0xff) << 0));	off += 4;	// Decode the options:	this.options = (  ((buf[off]   & 0xff) << 24)			+ ((buf[off+1] & 0xff) << 16)			+ ((buf[off+2] & 0xff) << 8)			+ ((buf[off+3] & 0xff) << 0));	off += 4;	// Skip padding (four bytes):	off += 4;	return off;    }    /**     * Get the length of that ICP message, if it were to be emitted.     * @return The length of the packet that would be emitted.     */    protected int getByteArrayLength() {	return 16;    }    /**     * Pack that message into a byte array suitable for emitting.     * @param buf The array to pack the request in.     * @return The length of the query, in bytes, or a negative number     * representing the size of the query.     */    protected int toByteArray(byte buf[]) {	// Check that we have enough room:	int length = getByteArrayLength();	if ( length > buf.length )	    return -length;	// Setup the ICP header:	buf[0] = (byte) opcode;	buf[1] = (byte) ICP.ICP_VERSION;	// Encode the length:	buf[2] = (byte) ((length >>> 8) & 0xff);	buf[3] = (byte) ((length >>> 0) & 0xff);	// Encode the identifier:	buf[4] = (byte) ((id >>> 24) & 0xff);	buf[5] = (byte) ((id >>> 16) & 0xff);	buf[6] = (byte) ((id >>> 8)  & 0xff);	buf[7] = (byte) ((id >>> 0)  & 0xff);	// We don't implement any options (four bytes):	buf[8]  = (byte) ((options >>> 24) & 0xff);	buf[9]  = (byte) ((options >>> 16) & 0xff);	buf[10] = (byte) ((options >>> 8)  & 0xff);	buf[11] = (byte) ((options >>> 0)  & 0xff);	// Skip padding:	return 16;    }    /**     * Get the identifier of that ICP message.     * @return An integer identifier.     */    protected final int getIdentifier() {	return id;    }    /**     * Get the opcode for this message.     * @return An integer opcode (as defined by the ICP protocol).     * @see ICP     */    protected final int getOpcode() {	return opcode;    }    /**     * Get the URL contained in that message.     * @return An URL instance.     */    protected final URL getURL() {	return url;    }    /**     * Get the address of the host that sent this packet.     * @return An InetAddress instance, or <strong>null</strong> if the message     * was created locally.     */    public InetAddress getSenderAddress() {	return addr;    }    /**     * Get the port number from which this message was emitted.     * @return A integer port number.     */    public int getSenderPort() {	return port;    }}

⌨️ 快捷键说明

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