basesockethandler.java
来自「一款Java实现的HTTP代理服务器」· Java 代码 · 共 94 行
JAVA
94 行
package rabbit.proxy;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.channels.ClosedChannelException;import java.nio.channels.SocketChannel;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import rabbit.io.HandlerRegistration;import rabbit.io.SocketHandler;import rabbit.util.Logger;/** A base class for socket handlers. * * @author <a href="mailto:robo@khelekore.org">Robert Olofsson</a> */public abstract class BaseSocketHandler implements SocketHandler { /** The client channel. */ protected SocketChannel channel; /** The selector we are using. */ protected Selector selector; /** The selection key we are using. */ protected SelectionKey sk; /** The logger to use. */ protected Logger logger; /** The current read buffer. */ protected ByteBuffer buffer; public BaseSocketHandler (SocketChannel channel, ByteBuffer buffer, Selector selector, Logger logger) throws IOException { this.channel = channel; this.buffer = buffer; this.selector = selector; this.logger = logger; register (); } protected void register () throws ClosedChannelException { int ops = getSocketOperations (); if (ops != 0) { HandlerRegistration hr = new HandlerRegistration (this); sk = channel.register (selector, ops, hr); } } protected void allocateBuffer () { // Socket reads really needs direct buffers... // TODO: get from pool. // TODO: how large? buffer = ByteBuffer.allocateDirect (4096); } protected abstract int getSocketOperations (); public boolean useSeparateThread () { return false; } protected Logger getLogger () { return logger; } protected void closeDown () { try { sk.attach ("BaseSocketHandler.closeDown"); sk.cancel (); channel.close (); clear (); } catch (IOException e) { getLogger ().logWarn ("Failed to close down connection: " + e); } } protected void unregister () { if (sk != null && sk.isValid ()) { sk.interestOps (0); sk.attach ("BaseSocketHandler.unregister"); } clear (); } private void clear () { sk = null; logger = null; selector = null; channel = null; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?