View Javadoc
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.netty.channel;
17  
18  import io.netty.buffer.ByteBuf;
19  import io.netty.buffer.ByteBufAllocator;
20  import io.netty.channel.socket.DatagramChannel;
21  import io.netty.channel.socket.DatagramPacket;
22  import io.netty.channel.socket.ServerSocketChannel;
23  import io.netty.channel.socket.SocketChannel;
24  import io.netty.util.AttributeMap;
25  
26  import java.net.InetSocketAddress;
27  import java.net.SocketAddress;
28  
29  
30  /**
31   * A nexus to a network socket or a component which is capable of I/O
32   * operations such as read, write, connect, and bind.
33   * <p>
34   * A channel provides a user:
35   * <ul>
36   * <li>the current state of the channel (e.g. is it open? is it connected?),</li>
37   * <li>the {@linkplain ChannelConfig configuration parameters} of the channel (e.g. receive buffer size),</li>
38   * <li>the I/O operations that the channel supports (e.g. read, write, connect, and bind), and</li>
39   * <li>the {@link ChannelPipeline} which handles all I/O events and requests
40   *     associated with the channel.</li>
41   * </ul>
42   *
43   * <h3>All I/O operations are asynchronous.</h3>
44   * <p>
45   * All I/O operations in Netty are asynchronous.  It means any I/O calls will
46   * return immediately with no guarantee that the requested I/O operation has
47   * been completed at the end of the call.  Instead, you will be returned with
48   * a {@link ChannelFuture} instance which will notify you when the requested I/O
49   * operation has succeeded, failed, or canceled.
50   *
51   * <h3>Channels are hierarchical</h3>
52   * <p>
53   * A {@link Channel} can have a {@linkplain #parent() parent} depending on
54   * how it was created.  For instance, a {@link SocketChannel}, that was accepted
55   * by {@link ServerSocketChannel}, will return the {@link ServerSocketChannel}
56   * as its parent on {@link #parent()}.
57   * <p>
58   * The semantics of the hierarchical structure depends on the transport
59   * implementation where the {@link Channel} belongs to.  For example, you could
60   * write a new {@link Channel} implementation that creates the sub-channels that
61   * share one socket connection, as <a href="http://beepcore.org/">BEEP</a> and
62   * <a href="https://en.wikipedia.org/wiki/Secure_Shell">SSH</a> do.
63   *
64   * <h3>Downcast to access transport-specific operations</h3>
65   * <p>
66   * Some transports exposes additional operations that is specific to the
67   * transport.  Down-cast the {@link Channel} to sub-type to invoke such
68   * operations.  For example, with the old I/O datagram transport, multicast
69   * join / leave operations are provided by {@link DatagramChannel}.
70   *
71   * <h3>Release resources</h3>
72   * <p>
73   * It is important to call {@link #close()} or {@link #close(ChannelPromise)} to release all
74   * resources once you are done with the {@link Channel}. This ensures all resources are
75   * released in a proper way, i.e. filehandles.
76   */
77  public interface Channel extends AttributeMap, ChannelOutboundInvoker, Comparable<Channel> {
78  
79      /**
80       * Returns the globally unique identifier of this {@link Channel}.
81       */
82      ChannelId id();
83  
84      /**
85       * Return the {@link EventLoop} this {@link Channel} was registered to.
86       */
87      EventLoop eventLoop();
88  
89      /**
90       * Returns the parent of this channel.
91       *
92       * @return the parent channel.
93       *         {@code null} if this channel does not have a parent channel.
94       */
95      Channel parent();
96  
97      /**
98       * Returns the configuration of this channel.
99       */
100     ChannelConfig config();
101 
102     /**
103      * Returns {@code true} if the {@link Channel} is open and may get active later
104      */
105     boolean isOpen();
106 
107     /**
108      * Returns {@code true} if the {@link Channel} is registered with an {@link EventLoop}.
109      */
110     boolean isRegistered();
111 
112     /**
113      * Return {@code true} if the {@link Channel} is active and so connected.
114      */
115     boolean isActive();
116 
117     /**
118      * Return the {@link ChannelMetadata} of the {@link Channel} which describe the nature of the {@link Channel}.
119      */
120     ChannelMetadata metadata();
121 
122     /**
123      * Returns the local address where this channel is bound to.  The returned
124      * {@link SocketAddress} is supposed to be down-cast into more concrete
125      * type such as {@link InetSocketAddress} to retrieve the detailed
126      * information.
127      *
128      * @return the local address of this channel.
129      *         {@code null} if this channel is not bound.
130      */
131     SocketAddress localAddress();
132 
133     /**
134      * Returns the remote address where this channel is connected to.  The
135      * returned {@link SocketAddress} is supposed to be down-cast into more
136      * concrete type such as {@link InetSocketAddress} to retrieve the detailed
137      * information.
138      *
139      * @return the remote address of this channel.
140      *         {@code null} if this channel is not connected.
141      *         If this channel is not connected but it can receive messages
142      *         from arbitrary remote addresses (e.g. {@link DatagramChannel},
143      *         use {@link DatagramPacket#recipient()} to determine
144      *         the origination of the received message as this method will
145      *         return {@code null}.
146      */
147     SocketAddress remoteAddress();
148 
149     /**
150      * Returns the {@link ChannelFuture} which will be notified when this
151      * channel is closed.  This method always returns the same future instance.
152      */
153     ChannelFuture closeFuture();
154 
155     /**
156      * Returns {@code true} if and only if the I/O thread will perform the
157      * requested write operation immediately.  Any write requests made when
158      * this method returns {@code false} are queued until the I/O thread is
159      * ready to process the queued write requests.
160      *
161      * {@link WriteBufferWaterMark} can be used to configure on which condition
162      * the write buffer would cause this channel to change writability.
163      */
164     default boolean isWritable() {
165         ChannelOutboundBuffer buf = unsafe().outboundBuffer();
166         return buf != null && buf.isWritable();
167     }
168 
169     /**
170      * Get how many bytes can be written until {@link #isWritable()} returns {@code false}.
171      * This quantity will always be non-negative. If {@link #isWritable()} is {@code false} then 0.
172      *
173      * {@link WriteBufferWaterMark} can be used to define writability settings.
174      */
175     default long bytesBeforeUnwritable() {
176         ChannelOutboundBuffer buf = unsafe().outboundBuffer();
177         // isWritable() is currently assuming if there is no outboundBuffer then the channel is not writable.
178         // We should be consistent with that here.
179         return buf != null ? buf.bytesBeforeUnwritable() : 0;
180     }
181 
182     /**
183      * Get how many bytes must be drained from underlying buffers until {@link #isWritable()} returns {@code true}.
184      * This quantity will always be non-negative. If {@link #isWritable()} is {@code true} then 0.
185      *
186      * {@link WriteBufferWaterMark} can be used to define writability settings.
187      */
188     default long bytesBeforeWritable() {
189         ChannelOutboundBuffer buf = unsafe().outboundBuffer();
190         // isWritable() is currently assuming if there is no outboundBuffer then the channel is not writable.
191         // We should be consistent with that here.
192         return buf != null ? buf.bytesBeforeWritable() : Long.MAX_VALUE;
193     }
194 
195     /**
196      * Returns an <em>internal-use-only</em> object that provides unsafe operations.
197      */
198     Unsafe unsafe();
199 
200     /**
201      * Return the assigned {@link ChannelPipeline}.
202      */
203     ChannelPipeline pipeline();
204 
205     /**
206      * Return the assigned {@link ByteBufAllocator} which will be used to allocate {@link ByteBuf}s.
207      */
208     default ByteBufAllocator alloc() {
209         return config().getAllocator();
210     }
211 
212     /**
213      * Return the value of the given {@link ChannelOption}
214      */
215     default <T> T getOption(ChannelOption<T> option) {
216         return config().getOption(option);
217     }
218 
219     /**
220      * Sets a configuration property with the specified name and value.
221      * To override this method properly, you must call the super class:
222      * <pre>
223      * public boolean setOption(ChannelOption&lt;T&gt; option, T value) {
224      *     if (super.setOption(option, value)) {
225      *         return true;
226      *     }
227      *
228      *     if (option.equals(additionalOption)) {
229      *         ....
230      *         return true;
231      *     }
232      *
233      *     return false;
234      * }
235      * </pre>
236      *
237      * @return {@code true} if and only if the property has been set
238      */
239     default <T> boolean setOption(ChannelOption<T> option, T value) {
240         return config().setOption(option, value);
241     }
242 
243     @Override
244     default Channel read() {
245         pipeline().read();
246         return this;
247     }
248 
249     @Override
250     default Channel flush() {
251         pipeline().flush();
252         return this;
253     }
254 
255     @Override
256     default ChannelFuture writeAndFlush(Object msg) {
257         return pipeline().writeAndFlush(msg);
258     }
259 
260     @Override
261     default ChannelFuture writeAndFlush(Object msg, ChannelPromise promise) {
262         return pipeline().writeAndFlush(msg, promise);
263     }
264 
265     @Override
266     default ChannelFuture write(Object msg, ChannelPromise promise) {
267         return pipeline().write(msg, promise);
268     }
269 
270     @Override
271     default ChannelFuture write(Object msg) {
272         return pipeline().write(msg);
273     }
274 
275     @Override
276     default ChannelFuture deregister(ChannelPromise promise) {
277         return pipeline().deregister(promise);
278     }
279 
280     @Override
281     default ChannelFuture close(ChannelPromise promise) {
282         return pipeline().close(promise);
283     }
284 
285     @Override
286     default ChannelFuture disconnect(ChannelPromise promise) {
287         return pipeline().disconnect(promise);
288     }
289 
290     @Override
291     default ChannelFuture connect(SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise) {
292         return pipeline().connect(remoteAddress, localAddress, promise);
293     }
294 
295     @Override
296     default ChannelFuture connect(SocketAddress remoteAddress, ChannelPromise promise) {
297         return pipeline().connect(remoteAddress, promise);
298     }
299 
300     @Override
301     default ChannelFuture bind(SocketAddress localAddress, ChannelPromise promise) {
302         return pipeline().bind(localAddress, promise);
303     }
304 
305     @Override
306     default ChannelFuture deregister() {
307         return pipeline().deregister();
308     }
309 
310     @Override
311     default ChannelFuture close() {
312         return pipeline().close();
313     }
314 
315     @Override
316     default ChannelFuture disconnect() {
317         return pipeline().disconnect();
318     }
319 
320     @Override
321     default ChannelFuture connect(SocketAddress remoteAddress, SocketAddress localAddress) {
322         return pipeline().connect(remoteAddress, localAddress);
323     }
324 
325     @Override
326     default ChannelFuture connect(SocketAddress remoteAddress) {
327         return pipeline().connect(remoteAddress);
328     }
329 
330     @Override
331     default ChannelFuture bind(SocketAddress localAddress) {
332         return pipeline().bind(localAddress);
333     }
334 
335     @Override
336     default ChannelPromise newPromise() {
337         return pipeline().newPromise();
338     }
339 
340     @Override
341     default ChannelProgressivePromise newProgressivePromise() {
342         return pipeline().newProgressivePromise();
343     }
344 
345     @Override
346     default ChannelFuture newSucceededFuture() {
347         return pipeline().newSucceededFuture();
348     }
349 
350     @Override
351     default ChannelFuture newFailedFuture(Throwable cause) {
352         return pipeline().newFailedFuture(cause);
353     }
354 
355     @Override
356     default ChannelPromise voidPromise() {
357         return pipeline().voidPromise();
358     }
359 
360     /**
361      * <em>Unsafe</em> operations that should <em>never</em> be called from user-code. These methods
362      * are only provided to implement the actual transport, and must be invoked from an I/O thread except for the
363      * following methods:
364      * <ul>
365      *   <li>{@link #localAddress()}</li>
366      *   <li>{@link #remoteAddress()}</li>
367      *   <li>{@link #closeForcibly()}</li>
368      *   <li>{@link #register(EventLoop, ChannelPromise)}</li>
369      *   <li>{@link #deregister(ChannelPromise)}</li>
370      *   <li>{@link #voidPromise()}</li>
371      * </ul>
372      */
373     interface Unsafe {
374 
375         /**
376          * Return the assigned {@link RecvByteBufAllocator.Handle} which will be used to allocate {@link ByteBuf}'s when
377          * receiving data.
378          */
379         RecvByteBufAllocator.Handle recvBufAllocHandle();
380 
381         /**
382          * Return the {@link SocketAddress} to which is bound local or
383          * {@code null} if none.
384          */
385         SocketAddress localAddress();
386 
387         /**
388          * Return the {@link SocketAddress} to which is bound remote or
389          * {@code null} if none is bound yet.
390          */
391         SocketAddress remoteAddress();
392 
393         /**
394          * Register the {@link Channel} of the {@link ChannelPromise} and notify
395          * the {@link ChannelFuture} once the registration was complete.
396          */
397         void register(EventLoop eventLoop, ChannelPromise promise);
398 
399         /**
400          * Bind the {@link SocketAddress} to the {@link Channel} of the {@link ChannelPromise} and notify
401          * it once its done.
402          */
403         void bind(SocketAddress localAddress, ChannelPromise promise);
404 
405         /**
406          * Connect the {@link Channel} of the given {@link ChannelFuture} with the given remote {@link SocketAddress}.
407          * If a specific local {@link SocketAddress} should be used it need to be given as argument. Otherwise just
408          * pass {@code null} to it.
409          *
410          * The {@link ChannelPromise} will get notified once the connect operation was complete.
411          */
412         void connect(SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise);
413 
414         /**
415          * Disconnect the {@link Channel} of the {@link ChannelFuture} and notify the {@link ChannelPromise} once the
416          * operation was complete.
417          */
418         void disconnect(ChannelPromise promise);
419 
420         /**
421          * Close the {@link Channel} of the {@link ChannelPromise} and notify the {@link ChannelPromise} once the
422          * operation was complete.
423          */
424         void close(ChannelPromise promise);
425 
426         /**
427          * Closes the {@link Channel} immediately without firing any events.  Probably only useful
428          * when registration attempt failed.
429          */
430         void closeForcibly();
431 
432         /**
433          * Deregister the {@link Channel} of the {@link ChannelPromise} from {@link EventLoop} and notify the
434          * {@link ChannelPromise} once the operation was complete.
435          */
436         void deregister(ChannelPromise promise);
437 
438         /**
439          * Schedules a read operation that fills the inbound buffer of the first {@link ChannelInboundHandler} in the
440          * {@link ChannelPipeline}.  If there's already a pending read operation, this method does nothing.
441          */
442         void beginRead();
443 
444         /**
445          * Schedules a write operation.
446          */
447         void write(Object msg, ChannelPromise promise);
448 
449         /**
450          * Flush out all write operations scheduled via {@link #write(Object, ChannelPromise)}.
451          */
452         void flush();
453 
454         /**
455          * Return a special ChannelPromise which can be reused and passed to the operations in {@link Unsafe}.
456          * It will never be notified of a success or error and so is only a placeholder for operations
457          * that take a {@link ChannelPromise} as argument but for which you not want to get notified.
458          */
459         ChannelPromise voidPromise();
460 
461         /**
462          * Returns the {@link ChannelOutboundBuffer} of the {@link Channel} where the pending write requests are stored.
463          */
464         ChannelOutboundBuffer outboundBuffer();
465     }
466 }