package org.jboss.netty.channel.socket.oio; import java.io.IOException; import java.io.OutputStream; import java.io.PushbackInputStream; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketException; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelSink; import org.jboss.netty.channel.ChannelException; import org.jboss.netty.channel.ChannelFactory; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.socket.DefaultSocketChannelConfig; import org.jboss.netty.channel.socket.SocketChannel; import org.jboss.netty.channel.socket.SocketChannelConfig; abstract class OioSocketChannel extends AbstractOioChannel implements SocketChannel { final Socket socket; //����͵�������ԭʼ��Java�׽��ֱ�̻����� private final SocketChannelConfig config; OioSocketChannel( Channel parent, ChannelFactory factory, ChannelPipeline pipeline, ChannelSink sink, Socket socket) { super(parent, factory, pipeline, sink); this.socket = socket; try { socket.setSoTimeout(1000); } catch (SocketException e) { throw new ChannelException( "Failed to configure the OioSocketChannel socket timeout.", e); } config = new DefaultSocketChannelConfig(socket); } public SocketChannelConfig getConfig() { return config; } abstract PushbackInputStream getInputStream(); abstract OutputStream getOutputStream(); @Override boolean isSocketBound() { return socket.isBound(); } @Override boolean isSocketConnected() { return socket.isConnected(); } @Override InetSocketAddress getLocalSocketAddress() throws Exception { //��ø��׽��ְ󶨶˵ĵ�ַ�����û�а���ΪNULL return (InetSocketAddress) socket.getLocalSocketAddress(); } @Override InetSocketAddress getRemoteSocketAddress() throws Exception { //��ø��׽��������ӣ��򷵻ضԶ˵ĵ�ַ return (InetSocketAddress) socket.getRemoteSocketAddress(); } @Override void closeSocket() throws IOException { socket.close(); } @Override boolean isSocketClosed() { return socket.isClosed(); } }