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