1 /* 2 * Copyright 2012 The Netty Project 3 * 4 * The Netty Project licenses this file to you under the Apache License, 5 * version 2.0 (the "License"); you may not use this file except in compliance 6 * with the License. You may obtain a copy of the License at: 7 * 8 * https://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations 14 * under the License. 15 */ 16 package io.netty5.channel; 17 18 import io.netty5.buffer.api.Buffer; 19 import io.netty5.buffer.api.BufferAllocator; 20 import io.netty5.channel.socket.DatagramChannel; 21 import io.netty5.channel.socket.DatagramPacket; 22 import io.netty5.channel.socket.ServerSocketChannel; 23 import io.netty5.channel.socket.SocketChannel; 24 import io.netty5.util.AttributeKey; 25 import io.netty5.util.AttributeMap; 26 import io.netty5.util.concurrent.Future; 27 28 import java.net.InetSocketAddress; 29 import java.net.SocketAddress; 30 31 /** 32 * A nexus to a network socket or a component which is capable of I/O 33 * operations such as read, write, connect, and bind. 34 * <p> 35 * A channel provides a user: 36 * <ul> 37 * <li>the current state of the channel (e.g. is it open? is it connected?),</li> 38 * <li>the configuration parameters of the channel (e.g. receive buffer size),</li> 39 * <li>the I/O operations that the channel supports (e.g. read, write, connect, and bind), and</li> 40 * <li>the {@link ChannelPipeline} which handles all I/O events and requests 41 * associated with the channel.</li> 42 * </ul> 43 * 44 * <h3>All I/O operations are asynchronous.</h3> 45 * <p> 46 * All I/O operations in Netty are asynchronous. It means any I/O calls will 47 * return immediately with no guarantee that the requested I/O operation has 48 * been completed at the end of the call. Instead, you will be returned with 49 * a {@link Future} instance which will notify you when the requested I/O 50 * operation has succeeded, failed, or canceled. 51 * 52 * <h3>Channels are hierarchical</h3> 53 * <p> 54 * A {@link Channel} can have a {@linkplain #parent() parent} depending on 55 * how it was created. For instance, a {@link SocketChannel}, that was accepted 56 * by {@link ServerSocketChannel}, will return the {@link ServerSocketChannel} 57 * as its parent on {@link #parent()}. 58 * <p> 59 * The semantics of the hierarchical structure depends on the transport 60 * implementation where the {@link Channel} belongs to. For example, you could 61 * write a new {@link Channel} implementation that creates the sub-channels that 62 * share one socket connection, as <a href="http://beepcore.org/">BEEP</a> and 63 * <a href="https://en.wikipedia.org/wiki/Secure_Shell">SSH</a> do. 64 * 65 * <h3>Downcast to access transport-specific operations</h3> 66 * <p> 67 * Some transports exposes additional operations that is specific to the 68 * transport. Down-cast the {@link Channel} to sub-type to invoke such 69 * operations. For example, with the old I/O datagram transport, multicast 70 * join / leave operations are provided by {@link DatagramChannel}. 71 * 72 * 73 * <h3>Storing stateful information</h3> 74 * 75 * {@link #attr(AttributeKey)} allow you to 76 * store and access stateful information that is related with a handler and its 77 * context. Please refer to {@link ChannelHandler} to learn various recommended 78 * ways to manage stateful information. 79 * 80 * <h3>Release resources</h3> 81 * <p> 82 * It is important to call {@link #close()} to release all 83 * resources once you are done with the {@link Channel}. This ensures all resources are 84 * released in a proper way, i.e. filehandles. 85 * 86 * <h3>Configuration / Option map</h3> 87 * 88 * An option map property is a dynamic write-only property which allows 89 * the configuration of a {@link Channel} without down-casting. 90 * To update an option map, please call {@link #setOption(ChannelOption, Object)}. 91 * <p> 92 * All {@link Channel} types have the following options: 93 * 94 * <table border="1" cellspacing="0" cellpadding="6"> 95 * <tr> 96 * <th>Name</th> 97 * </tr><tr> 98 * <td>{@link ChannelOption#CONNECT_TIMEOUT_MILLIS}</td> 99 * </tr><tr> 100 * <td>{@link ChannelOption#WRITE_SPIN_COUNT}</td> 101 * </tr><tr> 102 * <td>{@link ChannelOption#WRITE_BUFFER_WATER_MARK}</td> 103 * </tr><tr> 104 * <td>{@link ChannelOption#BUFFER_ALLOCATOR}</td> 105 * </tr><tr> 106 * <td>{@link ChannelOption#AUTO_READ}</td> 107 * </tr><tr> 108 * <td>{@link ChannelOption#ALLOW_HALF_CLOSURE}</td> 109 * </tr><tr> 110 * <td>{@link ChannelOption#MAX_MESSAGES_PER_WRITE}</td> 111 * </tr><tr> 112 * <td>{@link ChannelOption#ALLOW_HALF_CLOSURE}</td> 113 * </tr> 114 * </table> 115 * <p> 116 * More options are available in the sub-types of {@link Channel}. For 117 * example, you can configure the parameters which are specific to a TCP/IP 118 * socket as explained in {@link SocketChannel}. 119 */ 120 public interface Channel extends AttributeMap, ChannelOutboundInvoker, Comparable<Channel>, IoHandle { 121 122 /** 123 * Returns the globally unique identifier of this {@link Channel}. 124 */ 125 ChannelId id(); 126 127 /** 128 * Return the {@link EventLoop} this {@link Channel} was registered to. 129 */ 130 @Override 131 EventLoop executor(); 132 133 /** 134 * Returns the parent of this channel. 135 * 136 * @return the parent channel. 137 * {@code null} if this channel does not have a parent channel. 138 */ 139 Channel parent(); 140 141 /** 142 * Return the value of the given {@link ChannelOption} 143 * 144 * @param option the {@link ChannelOption}. 145 * @return the value for the {@link ChannelOption} 146 * @param <T> the type of the value. 147 * @throws ChannelException thrown on error. 148 * @throws UnsupportedOperationException if the {@link ChannelOption} is not supported. 149 */ 150 <T> T getOption(ChannelOption<T> option); 151 152 /** 153 * Sets a configuration property with the specified name and value. 154 * 155 * @param option the {@link ChannelOption}. 156 * @param value the value for the {@link ChannelOption} 157 * @return itself. 158 * @param <T> the type of the value. 159 * @throws ChannelException thrown on error. 160 * @throws UnsupportedOperationException if the {@link ChannelOption} is not supported. 161 */ 162 <T> Channel setOption(ChannelOption<T> option, T value); 163 164 /** 165 * Returns {@code true} if the given {@link ChannelOption} is supported by this {@link Channel} implementation. 166 * If this methods returns {@code false}, calls to {@link #setOption(ChannelOption, Object)} 167 * and {@link #getOption(ChannelOption)} with the {@link ChannelOption} will throw an 168 * {@link UnsupportedOperationException}. 169 * 170 * @param option the option. 171 * @return {@code} true if supported, {@code false} otherwise. 172 */ 173 boolean isOptionSupported(ChannelOption<?> option); 174 175 /** 176 * Returns {@code true} if the {@link Channel} is open and may get active later 177 */ 178 boolean isOpen(); 179 180 /** 181 * Return {@code true} if the {@link Channel} is active and so connected. 182 */ 183 boolean isActive(); 184 185 /** 186 * Returns {@code true} if the {@link ChannelShutdownDirection} of the {@link Channel} was shutdown before. 187 */ 188 boolean isShutdown(ChannelShutdownDirection direction); 189 190 /** 191 * Return the {@link ChannelMetadata} of the {@link Channel} which describe the nature of the {@link Channel}. 192 */ 193 ChannelMetadata metadata(); 194 195 /** 196 * Returns the local address where this channel is bound to. The returned 197 * {@link SocketAddress} is supposed to be down-cast into more concrete 198 * type such as {@link InetSocketAddress} to retrieve the detailed 199 * information. 200 * 201 * @return the local address of this channel. 202 * {@code null} if this channel is not bound. 203 */ 204 SocketAddress localAddress(); 205 206 /** 207 * Returns the remote address where this channel is connected to. The 208 * returned {@link SocketAddress} is supposed to be down-cast into more 209 * concrete type such as {@link InetSocketAddress} to retrieve the detailed 210 * information. 211 * 212 * @return the remote address of this channel. 213 * {@code null} if this channel is not connected. 214 * If this channel is not connected but it can receive messages 215 * from arbitrary remote addresses (e.g. {@link DatagramChannel}, 216 * use {@link DatagramPacket#recipient()} to determine 217 * the origination of the received message as this method will 218 * return {@code null}. 219 */ 220 SocketAddress remoteAddress(); 221 222 /** 223 * Returns the {@link Future} which will be notified when this 224 * channel is closed. This method always returns the same future instance. 225 */ 226 Future<Void> closeFuture(); 227 228 /** 229 * Returns {@code true} if and only if the I/O thread will perform the 230 * requested flush operation immediately. Any write requests made when 231 * this method returns {@code false} are queued until the I/O thread is 232 * ready to process the queued write requests. 233 */ 234 default boolean isWritable() { 235 return writableBytes() > 0; 236 } 237 238 /** 239 * Returns how many bytes can be written before the {@link Channel} becomes 'unwritable'. 240 * Once a {@link Channel} becomes unwritable, all messages will be queued until the I/O thread is 241 * ready to process the queued write requests. 242 * 243 * @return the number of bytes that can be written before the {@link Channel} becomes unwritable. 244 */ 245 long writableBytes(); 246 247 /** 248 * Return the assigned {@link ChannelPipeline}. 249 */ 250 ChannelPipeline pipeline(); 251 252 /** 253 * Return the assigned {@link BufferAllocator} which will be used to allocate {@link Buffer}s. 254 */ 255 BufferAllocator bufferAllocator(); 256 257 @Override 258 default Channel read() { 259 pipeline().read(); 260 return this; 261 } 262 263 @Override 264 default Future<Void> bind(SocketAddress localAddress) { 265 return pipeline().bind(localAddress); 266 } 267 268 @Override 269 default Future<Void> connect(SocketAddress remoteAddress) { 270 return pipeline().connect(remoteAddress); 271 } 272 273 @Override 274 default Future<Void> connect(SocketAddress remoteAddress, SocketAddress localAddress) { 275 return pipeline().connect(remoteAddress, localAddress); 276 } 277 278 @Override 279 default Future<Void> disconnect() { 280 return pipeline().disconnect(); 281 } 282 283 @Override 284 default Future<Void> close() { 285 return pipeline().close(); 286 } 287 288 @Override 289 default Future<Void> shutdown(ChannelShutdownDirection direction) { 290 return pipeline().shutdown(direction); 291 } 292 293 @Override 294 default Future<Void> register() { 295 return pipeline().register(); 296 } 297 298 @Override 299 default Future<Void> deregister() { 300 return pipeline().deregister(); 301 } 302 303 @Override 304 default Future<Void> write(Object msg) { 305 return pipeline().write(msg); 306 } 307 308 @Override 309 default Future<Void> writeAndFlush(Object msg) { 310 return pipeline().writeAndFlush(msg); 311 } 312 313 @Override 314 default Channel flush() { 315 pipeline().flush(); 316 return this; 317 } 318 319 @Override 320 default Future<Void> sendOutboundEvent(Object event) { 321 return pipeline().sendOutboundEvent(event); 322 } 323 }