muxsession.java

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

JAVA
245
字号
// MuxSession.java// $Id: MuxSession.java,v 1.9 2000/08/16 21:38:01 ylafon Exp $// (c) COPYRIGHT MIT and INRIA, 1996.// Please first read the full copyright statement in file COPYRIGHT.htmlpackage org.w3c.www.mux;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.PrintStream;import java.net.InetAddress;public class MuxSession /* extends Socket */ {    /**     * The default input buffer size for all sessions.     */    public static final int INPUT_BUFFER_SIZE = 4096;    /**     * The stream to which that session belongs.     */    protected MuxStream stream = null;    /**     * The session's input stream.     */    protected MuxInputStream in = null;    /**     * The session's output stream.     */    protected MuxOutputStream out = null;    /**     * This session's identifier.     */    protected int id = -1;    /**     * This session's protocol identifier.     */    protected int protid = -1;    /**     * Has this session been aborted ?     */    protected boolean aborted = false;    /**     * Has this session emitted a FIN (is it half-closed ?)     */    protected boolean finsent = false;    /**     * Push some data into that session's input stream.     * @param data The buffer containing the data to be pushed.     * @param off Offset of the data within above buffer.     * @param len Length of data to be pushed.     * @param noflush Set to <strong>true</strong> if there is already more     * data available for that session.     * @exception IOException If IO was interrupted.     */    protected final void pushInput(byte data[], int off, int len				   , boolean noflush) 	throws IOException    {	in.push(data, off, len, noflush);    }    /**     * Send a FIN message on that session.     */    protected final void sendFIN() 	throws IOException    {	if ( ! finsent ) {	    stream.getMuxWriter().writeMessage(id, MUX.FIN, 0);	    stream.getMuxWriter().flush();	    finsent = true;	}    }    /**     * We have received a FIN on that session's output stream.     * @exception IOException If some IO error occured.     */    protected final void notifyFIN() 	throws IOException    {	in.close();	if ( finsent )	    shutdown();    }    /**     * The other end is telling us that something is going wrong. Cleanup.     */    protected void notifyRST() 	throws IOException    {        in.error("Broken pipe");	out.close();	shutdown();    }    protected void notifyPUSH() {	System.out.println("MuxSession:notifyPUSH: not handled");    }    protected final void notifyCredit(int credit) {	out.notifyCredit(credit);    }    protected final void notifyControl(int fragsz) {	out.notifyControl(fragsz);    }    protected void notifyOutputClose() 	throws IOException    {	stream.getMuxWriter().writeMessage(id, MUX.FIN, 0);    }    /**     * Abort that session.     * The MUX stream erred, the underlying transport streams are broken.      * Terminate that session, make sure any further action on it will trigger     * an IO error.     */    protected synchronized void abort() {	aborted = true;	try {	    shutdown();	} catch (Exception ex) {	}    }    /**     * Shutdown that session gracefully.     */    public void shutdown() 	throws IOException    {	// Close both streams:	try {	    in.close();	} catch (Exception ex) {	    ex.printStackTrace();	} 	try {	    out.close();	} catch (Exception ex) {	    ex.printStackTrace();	}	// Unregister the session	stream.unregisterSession(this);    }    /**     * Get the Mux stream to which that session is attached.     * @return A MuxStream instance.     */    protected final MuxStream getMuxStream() {	return stream;    }    /**     * Get this session's input stream buffer size.     * @return The standard buffer size for that session input stream.     */    protected int getInputBufferSize() {	return INPUT_BUFFER_SIZE;    }    /**     * Get the other end's IP address.     * @return An InetAddress instance.     */    public InetAddress getInetAddress() {	return getMuxStream().getInetAddress();    }    /**     * Get this session identifier.     * @return An integer identifier for that session.     */    public final int getIdentifier() {	return id;    }    /**     * Get this session protocol identifier.     * @return An integer identifying the protocol runnin on that session.     */    public final int getProtocolIdentifier() {	return protid;    }    /**     * Get this session's input stream.     * @return An InputStream instance.     */    public synchronized InputStream getInputStream()	throws IOException    {	if ( aborted )	    throw new IOException("Aborted mux session");	return in;    }    /**     * Get this session's output stream.     * @return An OutputStream instance.     */    public synchronized OutputStream getOutputStream()	throws IOException    {	if ( aborted )	    throw new IOException("Aborted mux session");	return out;    }    protected MuxSession(MuxStream stream, int id, int protid) {	// Initialize state:	this.stream = stream;	this.id     = id;	this.protid = protid;	// Create input and output streams:	this.in  = new MuxInputStream(this);	this.out = new MuxOutputStream(this);    }						}

⌨️ 快捷键说明

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