Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/java.base/share/classes/java/nio/channels/AsynchronousSocketChannel.java
41159 views
1
/*
2
* Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
package java.nio.channels;
27
28
import java.nio.channels.spi.*;
29
import java.util.concurrent.TimeUnit;
30
import java.util.concurrent.Future;
31
import java.io.IOException;
32
import java.net.SocketOption;
33
import java.net.SocketAddress;
34
import java.nio.ByteBuffer;
35
36
/**
37
* An asynchronous channel for stream-oriented connecting sockets.
38
*
39
* <p> Asynchronous socket channels are created in one of two ways. A newly-created
40
* {@code AsynchronousSocketChannel} is created by invoking one of the {@link
41
* #open open} methods defined by this class. A newly-created channel is open but
42
* not yet connected. A connected {@code AsynchronousSocketChannel} is created
43
* when a connection is made to the socket of an {@link AsynchronousServerSocketChannel}.
44
* It is not possible to create an asynchronous socket channel for an arbitrary,
45
* pre-existing {@link java.net.Socket socket}.
46
*
47
* <p> A newly-created channel is connected by invoking its {@link #connect connect}
48
* method; once connected, a channel remains connected until it is closed. Whether
49
* or not a socket channel is connected may be determined by invoking its {@link
50
* #getRemoteAddress getRemoteAddress} method. An attempt to invoke an I/O
51
* operation upon an unconnected channel will cause a {@link NotYetConnectedException}
52
* to be thrown.
53
*
54
* <p> Channels of this type are safe for use by multiple concurrent threads.
55
* They support concurrent reading and writing, though at most one read operation
56
* and one write operation can be outstanding at any time.
57
* If a thread initiates a read operation before a previous read operation has
58
* completed then a {@link ReadPendingException} will be thrown. Similarly, an
59
* attempt to initiate a write operation before a previous write has completed
60
* will throw a {@link WritePendingException}.
61
*
62
* <p> Socket options are configured using the {@link #setOption(SocketOption,Object)
63
* setOption} method. Asynchronous socket channels support the following options:
64
* <blockquote>
65
* <table class="striped">
66
* <caption style="display:none">Socket options</caption>
67
* <thead>
68
* <tr>
69
* <th scope="col">Option Name</th>
70
* <th scope="col">Description</th>
71
* </tr>
72
* </thead>
73
* <tbody>
74
* <tr>
75
* <th scope="row"> {@link java.net.StandardSocketOptions#SO_SNDBUF SO_SNDBUF} </th>
76
* <td> The size of the socket send buffer </td>
77
* </tr>
78
* <tr>
79
* <th scope="row"> {@link java.net.StandardSocketOptions#SO_RCVBUF SO_RCVBUF} </th>
80
* <td> The size of the socket receive buffer </td>
81
* </tr>
82
* <tr>
83
* <th scope="row"> {@link java.net.StandardSocketOptions#SO_KEEPALIVE SO_KEEPALIVE} </th>
84
* <td> Keep connection alive </td>
85
* </tr>
86
* <tr>
87
* <th scope="row"> {@link java.net.StandardSocketOptions#SO_REUSEADDR SO_REUSEADDR} </th>
88
* <td> Re-use address </td>
89
* </tr>
90
* <tr>
91
* <th scope="row"> {@link java.net.StandardSocketOptions#TCP_NODELAY TCP_NODELAY} </th>
92
* <td> Disable the Nagle algorithm </td>
93
* </tr>
94
* </tbody>
95
* </table>
96
* </blockquote>
97
* Additional (implementation specific) options may also be supported.
98
*
99
* <h2>Timeouts</h2>
100
*
101
* <p> The {@link #read(ByteBuffer,long,TimeUnit,Object,CompletionHandler) read}
102
* and {@link #write(ByteBuffer,long,TimeUnit,Object,CompletionHandler) write}
103
* methods defined by this class allow a timeout to be specified when initiating
104
* a read or write operation. If the timeout elapses before an operation completes
105
* then the operation completes with the exception {@link
106
* InterruptedByTimeoutException}. A timeout may leave the channel, or the
107
* underlying connection, in an inconsistent state. Where the implementation
108
* cannot guarantee that bytes have not been read from the channel then it puts
109
* the channel into an implementation specific <em>error state</em>. A subsequent
110
* attempt to initiate a {@code read} operation causes an unspecified runtime
111
* exception to be thrown. Similarly if a {@code write} operation times out and
112
* the implementation cannot guarantee bytes have not been written to the
113
* channel then further attempts to {@code write} to the channel cause an
114
* unspecified runtime exception to be thrown. When a timeout elapses then the
115
* state of the {@link ByteBuffer}, or the sequence of buffers, for the I/O
116
* operation is not defined. Buffers should be discarded or at least care must
117
* be taken to ensure that the buffers are not accessed while the channel remains
118
* open. All methods that accept timeout parameters treat values less than or
119
* equal to zero to mean that the I/O operation does not timeout.
120
*
121
* @since 1.7
122
*/
123
124
public abstract class AsynchronousSocketChannel
125
implements AsynchronousByteChannel, NetworkChannel
126
{
127
private final AsynchronousChannelProvider provider;
128
129
/**
130
* Initializes a new instance of this class.
131
*
132
* @param provider
133
* The provider that created this channel
134
*/
135
protected AsynchronousSocketChannel(AsynchronousChannelProvider provider) {
136
this.provider = provider;
137
}
138
139
/**
140
* Returns the provider that created this channel.
141
*
142
* @return The provider that created this channel
143
*/
144
public final AsynchronousChannelProvider provider() {
145
return provider;
146
}
147
148
/**
149
* Opens an asynchronous socket channel.
150
*
151
* <p> The new channel is created by invoking the {@link
152
* AsynchronousChannelProvider#openAsynchronousSocketChannel
153
* openAsynchronousSocketChannel} method on the {@link
154
* AsynchronousChannelProvider} that created the group. If the group parameter
155
* is {@code null} then the resulting channel is created by the system-wide
156
* default provider, and bound to the <em>default group</em>.
157
*
158
* @param group
159
* The group to which the newly constructed channel should be bound,
160
* or {@code null} for the default group
161
*
162
* @return A new asynchronous socket channel
163
*
164
* @throws ShutdownChannelGroupException
165
* If the channel group is shutdown
166
* @throws IOException
167
* If an I/O error occurs
168
*/
169
public static AsynchronousSocketChannel open(AsynchronousChannelGroup group)
170
throws IOException
171
{
172
AsynchronousChannelProvider provider = (group == null) ?
173
AsynchronousChannelProvider.provider() : group.provider();
174
return provider.openAsynchronousSocketChannel(group);
175
}
176
177
/**
178
* Opens an asynchronous socket channel.
179
*
180
* <p> This method returns an asynchronous socket channel that is bound to
181
* the <em>default group</em>.This method is equivalent to evaluating the
182
* expression:
183
* <blockquote><pre>
184
* open((AsynchronousChannelGroup)null);
185
* </pre></blockquote>
186
*
187
* @return A new asynchronous socket channel
188
*
189
* @throws IOException
190
* If an I/O error occurs
191
*/
192
public static AsynchronousSocketChannel open()
193
throws IOException
194
{
195
return open(null);
196
}
197
198
199
// -- socket options and related --
200
201
/**
202
* @throws ConnectionPendingException
203
* If a connection operation is already in progress on this channel
204
* @throws AlreadyBoundException {@inheritDoc}
205
* @throws UnsupportedAddressTypeException {@inheritDoc}
206
* @throws ClosedChannelException {@inheritDoc}
207
* @throws IOException {@inheritDoc}
208
* @throws SecurityException
209
* If a security manager has been installed and its
210
* {@link SecurityManager#checkListen checkListen} method denies
211
* the operation
212
*/
213
@Override
214
public abstract AsynchronousSocketChannel bind(SocketAddress local)
215
throws IOException;
216
217
/**
218
* @throws IllegalArgumentException {@inheritDoc}
219
* @throws ClosedChannelException {@inheritDoc}
220
* @throws IOException {@inheritDoc}
221
*/
222
@Override
223
public abstract <T> AsynchronousSocketChannel setOption(SocketOption<T> name, T value)
224
throws IOException;
225
226
/**
227
* Shutdown the connection for reading without closing the channel.
228
*
229
* <p> Once shutdown for reading then further reads on the channel will
230
* return {@code -1}, the end-of-stream indication. If the input side of the
231
* connection is already shutdown then invoking this method has no effect.
232
* The effect on an outstanding read operation is system dependent and
233
* therefore not specified. The effect, if any, when there is data in the
234
* socket receive buffer that has not been read, or data arrives subsequently,
235
* is also system dependent.
236
*
237
* @return The channel
238
*
239
* @throws NotYetConnectedException
240
* If this channel is not yet connected
241
* @throws ClosedChannelException
242
* If this channel is closed
243
* @throws IOException
244
* If some other I/O error occurs
245
*/
246
public abstract AsynchronousSocketChannel shutdownInput() throws IOException;
247
248
/**
249
* Shutdown the connection for writing without closing the channel.
250
*
251
* <p> Once shutdown for writing then further attempts to write to the
252
* channel will throw {@link ClosedChannelException}. If the output side of
253
* the connection is already shutdown then invoking this method has no
254
* effect. The effect on an outstanding write operation is system dependent
255
* and therefore not specified.
256
*
257
* @return The channel
258
*
259
* @throws NotYetConnectedException
260
* If this channel is not yet connected
261
* @throws ClosedChannelException
262
* If this channel is closed
263
* @throws IOException
264
* If some other I/O error occurs
265
*/
266
public abstract AsynchronousSocketChannel shutdownOutput() throws IOException;
267
268
// -- state --
269
270
/**
271
* Returns the remote address to which this channel's socket is connected.
272
*
273
* <p> Where the channel is bound and connected to an Internet Protocol
274
* socket address then the return value from this method is of type {@link
275
* java.net.InetSocketAddress}.
276
*
277
* @return The remote address; {@code null} if the channel's socket is not
278
* connected
279
*
280
* @throws ClosedChannelException
281
* If the channel is closed
282
* @throws IOException
283
* If an I/O error occurs
284
*/
285
public abstract SocketAddress getRemoteAddress() throws IOException;
286
287
// -- asynchronous operations --
288
289
/**
290
* Connects this channel.
291
*
292
* <p> This method initiates an operation to connect this channel. The
293
* {@code handler} parameter is a completion handler that is invoked when
294
* the connection is successfully established or connection cannot be
295
* established. If the connection cannot be established then the channel is
296
* closed.
297
*
298
* <p> This method performs exactly the same security checks as the {@link
299
* java.net.Socket} class. That is, if a security manager has been
300
* installed then this method verifies that its {@link
301
* java.lang.SecurityManager#checkConnect checkConnect} method permits
302
* connecting to the address and port number of the given remote endpoint.
303
*
304
* @param <A>
305
* The type of the attachment
306
* @param remote
307
* The remote address to which this channel is to be connected
308
* @param attachment
309
* The object to attach to the I/O operation; can be {@code null}
310
* @param handler
311
* The handler for consuming the result
312
*
313
* @throws UnresolvedAddressException
314
* If the given remote address is not fully resolved
315
* @throws UnsupportedAddressTypeException
316
* If the type of the given remote address is not supported
317
* @throws AlreadyConnectedException
318
* If this channel is already connected
319
* @throws ConnectionPendingException
320
* If a connection operation is already in progress on this channel
321
* @throws ShutdownChannelGroupException
322
* If the channel group has terminated
323
* @throws SecurityException
324
* If a security manager has been installed
325
* and it does not permit access to the given remote endpoint
326
*
327
* @see #getRemoteAddress
328
*/
329
public abstract <A> void connect(SocketAddress remote,
330
A attachment,
331
CompletionHandler<Void,? super A> handler);
332
333
/**
334
* Connects this channel.
335
*
336
* <p> This method initiates an operation to connect this channel. This
337
* method behaves in exactly the same manner as the {@link
338
* #connect(SocketAddress, Object, CompletionHandler)} method except that
339
* instead of specifying a completion handler, this method returns a {@code
340
* Future} representing the pending result. The {@code Future}'s {@link
341
* Future#get() get} method returns {@code null} on successful completion.
342
*
343
* @param remote
344
* The remote address to which this channel is to be connected
345
*
346
* @return A {@code Future} object representing the pending result
347
*
348
* @throws UnresolvedAddressException
349
* If the given remote address is not fully resolved
350
* @throws UnsupportedAddressTypeException
351
* If the type of the given remote address is not supported
352
* @throws AlreadyConnectedException
353
* If this channel is already connected
354
* @throws ConnectionPendingException
355
* If a connection operation is already in progress on this channel
356
* @throws SecurityException
357
* If a security manager has been installed
358
* and it does not permit access to the given remote endpoint
359
*/
360
public abstract Future<Void> connect(SocketAddress remote);
361
362
/**
363
* Reads a sequence of bytes from this channel into the given buffer.
364
*
365
* <p> This method initiates an asynchronous read operation to read a
366
* sequence of bytes from this channel into the given buffer. The {@code
367
* handler} parameter is a completion handler that is invoked when the read
368
* operation completes (or fails). The result passed to the completion
369
* handler is the number of bytes read or {@code -1} if no bytes could be
370
* read because the channel has reached end-of-stream.
371
*
372
* <p> If a timeout is specified and the timeout elapses before the operation
373
* completes then the operation completes with the exception {@link
374
* InterruptedByTimeoutException}. Where a timeout occurs, and the
375
* implementation cannot guarantee that bytes have not been read, or will not
376
* be read from the channel into the given buffer, then further attempts to
377
* read from the channel will cause an unspecific runtime exception to be
378
* thrown.
379
*
380
* <p> Otherwise this method works in the same manner as the {@link
381
* AsynchronousByteChannel#read(ByteBuffer,Object,CompletionHandler)}
382
* method.
383
*
384
* @param <A>
385
* The type of the attachment
386
* @param dst
387
* The buffer into which bytes are to be transferred
388
* @param timeout
389
* The maximum time for the I/O operation to complete
390
* @param unit
391
* The time unit of the {@code timeout} argument
392
* @param attachment
393
* The object to attach to the I/O operation; can be {@code null}
394
* @param handler
395
* The handler for consuming the result
396
*
397
* @throws IllegalArgumentException
398
* If the buffer is read-only
399
* @throws ReadPendingException
400
* If a read operation is already in progress on this channel
401
* @throws NotYetConnectedException
402
* If this channel is not yet connected
403
* @throws ShutdownChannelGroupException
404
* If the channel group has terminated
405
*/
406
public abstract <A> void read(ByteBuffer dst,
407
long timeout,
408
TimeUnit unit,
409
A attachment,
410
CompletionHandler<Integer,? super A> handler);
411
412
/**
413
* @throws IllegalArgumentException {@inheritDoc}
414
* @throws ReadPendingException {@inheritDoc}
415
* @throws NotYetConnectedException
416
* If this channel is not yet connected
417
* @throws ShutdownChannelGroupException
418
* If the channel group has terminated
419
*/
420
@Override
421
public final <A> void read(ByteBuffer dst,
422
A attachment,
423
CompletionHandler<Integer,? super A> handler)
424
{
425
read(dst, 0L, TimeUnit.MILLISECONDS, attachment, handler);
426
}
427
428
/**
429
* @throws IllegalArgumentException {@inheritDoc}
430
* @throws ReadPendingException {@inheritDoc}
431
* @throws NotYetConnectedException
432
* If this channel is not yet connected
433
*/
434
@Override
435
public abstract Future<Integer> read(ByteBuffer dst);
436
437
/**
438
* Reads a sequence of bytes from this channel into a subsequence of the
439
* given buffers. This operation, sometimes called a <em>scattering read</em>,
440
* is often useful when implementing network protocols that group data into
441
* segments consisting of one or more fixed-length headers followed by a
442
* variable-length body. The {@code handler} parameter is a completion
443
* handler that is invoked when the read operation completes (or fails). The
444
* result passed to the completion handler is the number of bytes read or
445
* {@code -1} if no bytes could be read because the channel has reached
446
* end-of-stream.
447
*
448
* <p> This method initiates a read of up to <i>r</i> bytes from this channel,
449
* where <i>r</i> is the total number of bytes remaining in the specified
450
* subsequence of the given buffer array, that is,
451
*
452
* <blockquote><pre>
453
* dsts[offset].remaining()
454
* + dsts[offset+1].remaining()
455
* + ... + dsts[offset+length-1].remaining()</pre></blockquote>
456
*
457
* at the moment that the read is attempted.
458
*
459
* <p> Suppose that a byte sequence of length <i>n</i> is read, where
460
* {@code 0}&nbsp;{@code <}&nbsp;<i>n</i>&nbsp;{@code <=}&nbsp;<i>r</i>.
461
* Up to the first {@code dsts[offset].remaining()} bytes of this sequence
462
* are transferred into buffer {@code dsts[offset]}, up to the next
463
* {@code dsts[offset+1].remaining()} bytes are transferred into buffer
464
* {@code dsts[offset+1]}, and so forth, until the entire byte sequence
465
* is transferred into the given buffers. As many bytes as possible are
466
* transferred into each buffer, hence the final position of each updated
467
* buffer, except the last updated buffer, is guaranteed to be equal to
468
* that buffer's limit. The underlying operating system may impose a limit
469
* on the number of buffers that may be used in an I/O operation. Where the
470
* number of buffers (with bytes remaining), exceeds this limit, then the
471
* I/O operation is performed with the maximum number of buffers allowed by
472
* the operating system.
473
*
474
* <p> If a timeout is specified and the timeout elapses before the operation
475
* completes then it completes with the exception {@link
476
* InterruptedByTimeoutException}. Where a timeout occurs, and the
477
* implementation cannot guarantee that bytes have not been read, or will not
478
* be read from the channel into the given buffers, then further attempts to
479
* read from the channel will cause an unspecific runtime exception to be
480
* thrown.
481
*
482
* @param <A>
483
* The type of the attachment
484
* @param dsts
485
* The buffers into which bytes are to be transferred
486
* @param offset
487
* The offset within the buffer array of the first buffer into which
488
* bytes are to be transferred; must be non-negative and no larger than
489
* {@code dsts.length}
490
* @param length
491
* The maximum number of buffers to be accessed; must be non-negative
492
* and no larger than {@code dsts.length - offset}
493
* @param timeout
494
* The maximum time for the I/O operation to complete
495
* @param unit
496
* The time unit of the {@code timeout} argument
497
* @param attachment
498
* The object to attach to the I/O operation; can be {@code null}
499
* @param handler
500
* The handler for consuming the result
501
*
502
* @throws IndexOutOfBoundsException
503
* If the pre-conditions for the {@code offset} and {@code length}
504
* parameter aren't met
505
* @throws IllegalArgumentException
506
* If the buffer is read-only
507
* @throws ReadPendingException
508
* If a read operation is already in progress on this channel
509
* @throws NotYetConnectedException
510
* If this channel is not yet connected
511
* @throws ShutdownChannelGroupException
512
* If the channel group has terminated
513
*/
514
public abstract <A> void read(ByteBuffer[] dsts,
515
int offset,
516
int length,
517
long timeout,
518
TimeUnit unit,
519
A attachment,
520
CompletionHandler<Long,? super A> handler);
521
522
/**
523
* Writes a sequence of bytes to this channel from the given buffer.
524
*
525
* <p> This method initiates an asynchronous write operation to write a
526
* sequence of bytes to this channel from the given buffer. The {@code
527
* handler} parameter is a completion handler that is invoked when the write
528
* operation completes (or fails). The result passed to the completion
529
* handler is the number of bytes written.
530
*
531
* <p> If a timeout is specified and the timeout elapses before the operation
532
* completes then it completes with the exception {@link
533
* InterruptedByTimeoutException}. Where a timeout occurs, and the
534
* implementation cannot guarantee that bytes have not been written, or will
535
* not be written to the channel from the given buffer, then further attempts
536
* to write to the channel will cause an unspecific runtime exception to be
537
* thrown.
538
*
539
* <p> Otherwise this method works in the same manner as the {@link
540
* AsynchronousByteChannel#write(ByteBuffer,Object,CompletionHandler)}
541
* method.
542
*
543
* @param <A>
544
* The type of the attachment
545
* @param src
546
* The buffer from which bytes are to be retrieved
547
* @param timeout
548
* The maximum time for the I/O operation to complete
549
* @param unit
550
* The time unit of the {@code timeout} argument
551
* @param attachment
552
* The object to attach to the I/O operation; can be {@code null}
553
* @param handler
554
* The handler for consuming the result
555
*
556
* @throws WritePendingException
557
* If a write operation is already in progress on this channel
558
* @throws NotYetConnectedException
559
* If this channel is not yet connected
560
* @throws ShutdownChannelGroupException
561
* If the channel group has terminated
562
*/
563
public abstract <A> void write(ByteBuffer src,
564
long timeout,
565
TimeUnit unit,
566
A attachment,
567
CompletionHandler<Integer,? super A> handler);
568
569
/**
570
* @throws WritePendingException {@inheritDoc}
571
* @throws NotYetConnectedException
572
* If this channel is not yet connected
573
* @throws ShutdownChannelGroupException
574
* If the channel group has terminated
575
*/
576
@Override
577
public final <A> void write(ByteBuffer src,
578
A attachment,
579
CompletionHandler<Integer,? super A> handler)
580
581
{
582
write(src, 0L, TimeUnit.MILLISECONDS, attachment, handler);
583
}
584
585
/**
586
* @throws WritePendingException {@inheritDoc}
587
* @throws NotYetConnectedException
588
* If this channel is not yet connected
589
*/
590
@Override
591
public abstract Future<Integer> write(ByteBuffer src);
592
593
/**
594
* Writes a sequence of bytes to this channel from a subsequence of the given
595
* buffers. This operation, sometimes called a <em>gathering write</em>, is
596
* often useful when implementing network protocols that group data into
597
* segments consisting of one or more fixed-length headers followed by a
598
* variable-length body. The {@code handler} parameter is a completion
599
* handler that is invoked when the write operation completes (or fails).
600
* The result passed to the completion handler is the number of bytes written.
601
*
602
* <p> This method initiates a write of up to <i>r</i> bytes to this channel,
603
* where <i>r</i> is the total number of bytes remaining in the specified
604
* subsequence of the given buffer array, that is,
605
*
606
* <blockquote><pre>
607
* srcs[offset].remaining()
608
* + srcs[offset+1].remaining()
609
* + ... + srcs[offset+length-1].remaining()</pre></blockquote>
610
*
611
* at the moment that the write is attempted.
612
*
613
* <p> Suppose that a byte sequence of length <i>n</i> is written, where
614
* {@code 0}&nbsp;{@code <}&nbsp;<i>n</i>&nbsp;{@code <=}&nbsp;<i>r</i>.
615
* Up to the first {@code srcs[offset].remaining()} bytes of this sequence
616
* are written from buffer {@code srcs[offset]}, up to the next
617
* {@code srcs[offset+1].remaining()} bytes are written from buffer
618
* {@code srcs[offset+1]}, and so forth, until the entire byte sequence is
619
* written. As many bytes as possible are written from each buffer, hence
620
* the final position of each updated buffer, except the last updated
621
* buffer, is guaranteed to be equal to that buffer's limit. The underlying
622
* operating system may impose a limit on the number of buffers that may be
623
* used in an I/O operation. Where the number of buffers (with bytes
624
* remaining), exceeds this limit, then the I/O operation is performed with
625
* the maximum number of buffers allowed by the operating system.
626
*
627
* <p> If a timeout is specified and the timeout elapses before the operation
628
* completes then it completes with the exception {@link
629
* InterruptedByTimeoutException}. Where a timeout occurs, and the
630
* implementation cannot guarantee that bytes have not been written, or will
631
* not be written to the channel from the given buffers, then further attempts
632
* to write to the channel will cause an unspecific runtime exception to be
633
* thrown.
634
*
635
* @param <A>
636
* The type of the attachment
637
* @param srcs
638
* The buffers from which bytes are to be retrieved
639
* @param offset
640
* The offset within the buffer array of the first buffer from which
641
* bytes are to be retrieved; must be non-negative and no larger
642
* than {@code srcs.length}
643
* @param length
644
* The maximum number of buffers to be accessed; must be non-negative
645
* and no larger than {@code srcs.length - offset}
646
* @param timeout
647
* The maximum time for the I/O operation to complete
648
* @param unit
649
* The time unit of the {@code timeout} argument
650
* @param attachment
651
* The object to attach to the I/O operation; can be {@code null}
652
* @param handler
653
* The handler for consuming the result
654
*
655
* @throws IndexOutOfBoundsException
656
* If the pre-conditions for the {@code offset} and {@code length}
657
* parameter aren't met
658
* @throws WritePendingException
659
* If a write operation is already in progress on this channel
660
* @throws NotYetConnectedException
661
* If this channel is not yet connected
662
* @throws ShutdownChannelGroupException
663
* If the channel group has terminated
664
*/
665
public abstract <A> void write(ByteBuffer[] srcs,
666
int offset,
667
int length,
668
long timeout,
669
TimeUnit unit,
670
A attachment,
671
CompletionHandler<Long,? super A> handler);
672
673
/**
674
* {@inheritDoc}
675
* <p>
676
* If there is a security manager set, its {@code checkConnect} method is
677
* called with the local address and {@code -1} as its arguments to see
678
* if the operation is allowed. If the operation is not allowed,
679
* a {@code SocketAddress} representing the
680
* {@link java.net.InetAddress#getLoopbackAddress loopback} address and the
681
* local port of the channel's socket is returned.
682
*
683
* @return The {@code SocketAddress} that the socket is bound to, or the
684
* {@code SocketAddress} representing the loopback address if
685
* denied by the security manager, or {@code null} if the
686
* channel's socket is not bound
687
*
688
* @throws ClosedChannelException {@inheritDoc}
689
* @throws IOException {@inheritDoc}
690
*/
691
public abstract SocketAddress getLocalAddress() throws IOException;
692
}
693
694