/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License.
*/ package org.apache.tomcat.util.net;
/** * Base class for a SocketChannel wrapper used by the endpoint. * This way, logic for an SSL socket channel remains the same as for * a non SSL, making sure we don't need to code for any exception cases.
*/ publicclass NioChannel implements ByteChannel, ScatteringByteChannel, GatheringByteChannel {
protectedstaticfinal StringManager sm = StringManager.getManager(NioChannel.class);
/** * Closes this channel. * * @throws IOException If an I/O error occurs
*/
@Override publicvoid close() throws IOException {
sc.close();
}
/** * Close the connection. * * @param force Should the underlying socket be forcibly closed? * @throws IOException If closing the secure channel fails.
*/ publicvoid close(boolean force) throws IOException { if (isOpen() || force) {
close();
}
}
/** * Tells whether or not this channel is open. * * @return <code>true</code> if, and only if, this channel is open
*/
@Override publicboolean isOpen() { return sc.isOpen();
}
/** * Writes a sequence of bytes to this channel from the given buffer. * * @param src The buffer from which bytes are to be retrieved * @return The number of bytes written, possibly zero * @throws IOException If some other I/O error occurs
*/
@Override publicint write(ByteBuffer src) throws IOException {
checkInterruptStatus(); return sc.write(src);
}
@Override publiclong write(ByteBuffer[] srcs, int offset, int length) throws IOException {
checkInterruptStatus(); return sc.write(srcs, offset, length);
}
/** * Reads a sequence of bytes from this channel into the given buffer. * * @param dst The buffer into which bytes are to be transferred * @return The number of bytes read, possibly zero, or <code>-1</code> if * the channel has reached end-of-stream * @throws IOException If some other I/O error occurs
*/
@Override publicint read(ByteBuffer dst) throws IOException { return sc.read(dst);
}
/** * Return true if the buffer wrote data. NO-OP for non-secure channel. * * @return Always returns {@code false} for non-secure channel * @throws IOException Never for non-secure channel
*/ publicboolean flushOutbound() throws IOException { returnfalse;
}
/** * This method should be used to check the interrupt status before * attempting a write. * * If a thread has been interrupted and the interrupt has not been cleared * then an attempt to write to the socket will fail. When this happens the * socket is removed from the poller without the socket being selected. This * results in a connection limit leak for NIO as the endpoint expects the * socket to be selected even in error conditions. * * @throws IOException If the current thread was interrupted
*/ protectedvoid checkInterruptStatus() throws IOException { if (Thread.interrupted()) { thrownew IOException(sm.getString("channel.nio.interrupted"));
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.