public abstract class SocketChannel
extends AbstractSelectableChannel
implements ByteChannel, ScatteringByteChannel, GatheringByteChannel, NetworkChannel
java.lang.Object | ||||
↳ | java.nio.channels.spi.AbstractInterruptibleChannel | |||
↳ | java.nio.channels.SelectableChannel | |||
↳ | java.nio.channels.spi.AbstractSelectableChannel | |||
↳ | java.nio.channels.SocketChannel |
面向流的连接插槽的可选通道。
通过调用open
方法之一来创建套接字通道。 无法为任意的预先存在的套接字创建通道。 新创建的套接字通道已打开,但尚未连接。 尝试在未连接的通道上调用I / O操作将导致引发NotYetConnectedException
。 套接字通道可以通过调用其connect
方法来连接; 一旦连接,套接字通道保持连接状态,直到关闭。 是否连接套接字通道可以通过调用其isConnected
方法来确定。
套接字通道支持非阻塞连接:可以创建套接字通道,并且可以通过connect
方法启动建立到远程套接字的链接的过程,以便以后通过finishConnect
方法完成。 可以通过调用isConnectionPending
方法来确定是否正在进行连接操作。
套接字通道支持异步关闭,这与Channel
类中指定的异步关闭操作类似。 如果套接字的输入端被一个线程关闭,而另一个线程在套接字通道的读操作中被阻塞,则被阻塞的线程中的读操作将完成而不读取任何字节,并且将返回-1 。 如果套接字的输出侧被一个线程关闭,而另一个线程在套接字通道上的写操作中被阻塞, AsynchronousCloseException
阻塞的线程将收到AsynchronousCloseException
。
套接字选项使用setOption
方法进行配置。 套接字通道支持以下选项:
Additional (implementation specific) options may also be supported.
Option Name 描述 SO_SNDBUF
The size of the socket send buffer SO_RCVBUF
The size of the socket receive buffer SO_KEEPALIVE
Keep connection alive SO_REUSEADDR
Re-use address SO_LINGER
Linger on close if data is present (when configured in blocking mode only) TCP_NODELAY
Disable the Nagle algorithm
套接字通道可安全地用于多个并发线程。 它们支持并发读写,尽管最多只有一个线程可能正在读取,并且在任何给定时间最多只有一个线程可能正在写入。 connect
和finishConnect
方法彼此相互同步,并且在调用其中一个方法的过程中尝试启动读取或写入操作将会阻塞,直到该调用完成。
Protected constructors |
|
---|---|
SocketChannel(SelectorProvider provider) 初始化此类的新实例。 |
Public methods |
|
---|---|
abstract SocketChannel |
bind(SocketAddress local) 将通道的套接字绑定到本地地址。 |
abstract boolean |
connect(SocketAddress remote) 连接此通道的插座。 |
abstract boolean |
finishConnect() 完成连接套接字通道的过程。 |
abstract SocketAddress |
getRemoteAddress() 返回此通道套接字连接的远程地址。 |
abstract boolean |
isConnected() 确定此通道的网络套接字是否已连接。 |
abstract boolean |
isConnectionPending() 确定此通道是否正在进行连接操作。 |
static SocketChannel |
open() 打开套接字通道。 |
static SocketChannel |
open(SocketAddress remote) 打开套接字通道并将其连接到远程地址。 |
abstract long |
read(ByteBuffer[] dsts, int offset, int length) 从该通道读取一系列字节到给定缓冲区的子序列中。 |
abstract int |
read(ByteBuffer dst) 从此通道读取一系列字节到指定的缓冲区中。 |
final long |
read(ByteBuffer[] dsts) 从该通道读取一系列字节到给定的缓冲区中。 |
abstract <T> SocketChannel |
setOption(SocketOption<T> name, T value) 设置套接字选项的值。 |
abstract SocketChannel |
shutdownInput() 关闭连接进行读取而不关闭通道。 |
abstract SocketChannel |
shutdownOutput() 关闭连接写入而不关闭通道。 |
abstract Socket |
socket() 检索与此通道关联的套接字。 |
final int |
validOps() 返回标识此频道支持的操作的操作集。 |
abstract int |
write(ByteBuffer src) 从给定缓冲区中向此通道写入一个字节序列。 |
final long |
write(ByteBuffer[] srcs) 从给定的缓冲区中写入一个字节序列到这个通道。 |
abstract long |
write(ByteBuffer[] srcs, int offset, int length) 从给定缓冲区的子序列向此通道写入一个字节序列。 |
Inherited methods |
|
---|---|
From class java.nio.channels.spi.AbstractSelectableChannel
|
|
From class java.nio.channels.SelectableChannel
|
|
From class java.nio.channels.spi.AbstractInterruptibleChannel
|
|
From class java.lang.Object
|
|
From interface java.nio.channels.Channel
|
|
From interface java.nio.channels.InterruptibleChannel
|
|
From interface java.nio.channels.ScatteringByteChannel
|
|
From interface java.nio.channels.GatheringByteChannel
|
|
From interface java.nio.channels.NetworkChannel
|
|
From interface java.io.Closeable
|
|
From interface java.nio.channels.ReadableByteChannel
|
|
From interface java.nio.channels.WritableByteChannel
|
|
From interface java.lang.AutoCloseable
|
SocketChannel (SelectorProvider provider)
初始化此类的新实例。
Parameters | |
---|---|
provider |
SelectorProvider
|
SocketChannel bind (SocketAddress local)
将通道的套接字绑定到本地地址。
此方法用于在套接字和本地地址之间建立关联。 一旦建立了关联,套接字就会保持绑定状态,直到通道关闭。 如果local
参数的值为null
那么套接字将被绑定到自动分配的地址。
Parameters | |
---|---|
local |
SocketAddress : The address to bind the socket, or null to bind the socket to an automatically assigned socket address |
Returns | |
---|---|
SocketChannel |
This channel |
Throws | |
---|---|
ConnectionPendingException |
If a non-blocking connect operation is already in progress on this channel |
AlreadyBoundException |
|
UnsupportedAddressTypeException |
|
ClosedChannelException |
|
IOException |
boolean connect (SocketAddress remote)
连接此通道的插座。
如果此通道处于非阻塞模式,则调用此方法将启动非阻塞连接操作。 如果立即建立连接,就像本地连接可能发生的那样,则此方法返回true 。 否则,此方法返回false,并且以后必须通过调用finishConnect
方法完成连接操作。
如果此通道处于阻塞模式,则此方法的调用将阻塞,直到建立连接或发生I / O错误。
此方法执行与Socket
类完全相同的安全检查。 也就是说,如果安装了安全管理器,则此方法将验证其checkConnect
方法是否允许连接到给定远程端点的地址和端口号。
这个方法可以在任何时候调用。 如果在调用此方法时调用此通道上的读取或写入操作,则该操作将首先阻塞,直到此调用完成。 如果连接尝试启动但失败,也就是说,如果此方法的调用引发检查的异常,则通道将被关闭。
Parameters | |
---|---|
remote |
SocketAddress : The remote address to which this channel is to be connected |
Returns | |
---|---|
boolean |
true if a connection was established, false if this channel is in non-blocking mode and the connection operation is in progress |
Throws | |
---|---|
AlreadyConnectedException |
If this channel is already connected |
ConnectionPendingException |
If a non-blocking connection operation is already in progress on this channel |
ClosedChannelException |
If this channel is closed |
AsynchronousCloseException |
If another thread closes this channel while the connect operation is in progress |
ClosedByInterruptException |
If another thread interrupts the current thread while the connect operation is in progress, thereby closing the channel and setting the current thread's interrupt status |
UnresolvedAddressException |
If the given remote address is not fully resolved |
UnsupportedAddressTypeException |
If the type of the given remote address is not supported |
SecurityException |
If a security manager has been installed and it does not permit access to the given remote endpoint |
IOException |
If some other I/O error occurs |
boolean finishConnect ()
完成连接套接字通道的过程。
通过将套接字通道置于非阻塞模式,然后调用其connect
方法来启动非阻塞连接操作。 一旦建立连接或尝试失败,套接字通道将变为可连接并且可以调用此方法以完成连接序列。 如果连接操作失败,则调用此方法将导致引发相应的IOException
。
如果此通道已连接,则此方法不会阻止并立即返回true 。 如果此通道处于非阻塞模式,则如果连接过程尚未完成,则此方法将返回false 。 如果此通道处于阻塞模式,则此方法将阻塞,直到连接完成或失败,并始终返回true或抛出检查异常来描述失败。
这个方法可以在任何时候调用。 如果在调用此方法时调用此通道上的读取或写入操作,则该操作将首先阻塞,直到此调用完成。 如果连接尝试失败,也就是说,如果此方法的调用引发检查的异常,则通道将被关闭。
Returns | |
---|---|
boolean |
true if, and only if, this channel's socket is now connected |
Throws | |
---|---|
NoConnectionPendingException |
If this channel is not connected and a connection operation has not been initiated |
ClosedChannelException |
If this channel is closed |
AsynchronousCloseException |
If another thread closes this channel while the connect operation is in progress |
ClosedByInterruptException |
If another thread interrupts the current thread while the connect operation is in progress, thereby closing the channel and setting the current thread's interrupt status |
IOException |
If some other I/O error occurs |
SocketAddress getRemoteAddress ()
返回此通道套接字连接的远程地址。
如果通道绑定并连接到Internet协议套接字地址,则此方法的返回值为 InetSocketAddress
。
Returns | |
---|---|
SocketAddress |
The remote address; null if the channel's socket is not connected |
Throws | |
---|---|
ClosedChannelException |
If the channel is closed |
IOException |
If an I/O error occurs |
boolean isConnected ()
确定此通道的网络套接字是否已连接。
Returns | |
---|---|
boolean |
true if, and only if, this channel's network socket is open and connected |
boolean isConnectionPending ()
确定此通道是否正在进行连接操作。
Returns | |
---|---|
boolean |
true if, and only if, a connection operation has been initiated on this channel but not yet completed by invoking the finishConnect method |
SocketChannel open ()
打开套接字通道。
新通道是通过调用系统范围的默认 SelectorProvider
对象的 openSocketChannel
方法创建的。
Returns | |
---|---|
SocketChannel |
A new socket channel |
Throws | |
---|---|
IOException |
If an I/O error occurs |
SocketChannel open (SocketAddress remote)
打开套接字通道并将其连接到远程地址。
这种便捷方法的作用就好像调用 open()
方法,在生成的套接字通道上调用 connect
方法,传递 remote ,然后返回该通道。
Parameters | |
---|---|
remote |
SocketAddress : The remote address to which the new channel is to be connected |
Returns | |
---|---|
SocketChannel |
Throws | |
---|---|
AsynchronousCloseException |
If another thread closes this channel while the connect operation is in progress |
ClosedByInterruptException |
If another thread interrupts the current thread while the connect operation is in progress, thereby closing the channel and setting the current thread's interrupt status |
UnresolvedAddressException |
If the given remote address is not fully resolved |
UnsupportedAddressTypeException |
If the type of the given remote address is not supported |
SecurityException |
If a security manager has been installed and it does not permit access to the given remote endpoint |
IOException |
If some other I/O error occurs |
long read (ByteBuffer[] dsts, int offset, int length)
从该通道读取一系列字节到给定缓冲区的子序列中。
此方法的调用尝试从该通道读取多达 r个字节,其中 r是给定缓冲区数组中指定子序列剩余的字节总数,也就是说,
at the moment that this method is invoked.dsts[offset].remaining() + dsts[offset+1].remaining() + ... + dsts[offset+length-1].remaining()
假设读取长度为n的字节序列,其中0 <= n <= r 。 直到该序列的第一个dsts[offset].remaining()字节被传送到缓冲区dsts[offset] ,直到下一个dsts[offset+1].remaining()字节被传送到缓冲区dsts[offset+1]等等,直到整个字节序列被传送到给定缓冲区。 尽可能多的字节传输到每个缓冲区,因此每个更新缓冲区的最终位置(除了最后更新的缓冲区)都保证等于该缓冲区的限制。
这个方法可以在任何时候调用。 然而,如果另一个线程已经在这个通道上启动了一个读操作,那么这个方法的调用将会阻塞,直到第一个操作完成。
Parameters | |
---|---|
dsts |
ByteBuffer : The buffers into which bytes are to be transferred |
offset |
int : The offset within the buffer array of the first buffer into which bytes are to be transferred; must be non-negative and no larger than dsts.length |
length |
int : The maximum number of buffers to be accessed; must be non-negative and no larger than dsts.length - offset |
Returns | |
---|---|
long |
The number of bytes read, possibly zero, or -1 if the channel has reached end-of-stream |
Throws | |
---|---|
NotYetConnectedException |
If this channel is not yet connected |
IOException |
int read (ByteBuffer dst)
从此通道读取一系列字节到指定的缓冲区中。
尝试从通道读取多达 r个字节,其中 r是在调用此方法时缓冲区中剩余的字节数,即 dst.remaining() 。
假设读取了长度为n的字节序列,其中0 <= n <= r 。 这个字节序列将被传送到缓冲区,以便序列中的第一个字节在索引p处 ,最后一个字节在索引p + n - 1 ,其中p是调用此方法时缓冲区的位置。 返回时,缓冲区的位置将等于p + n ; 其限制不会改变。
读取操作可能不会填充缓冲区,实际上它可能根本不读取任何字节。 是否这样做取决于频道的性质和状态。 例如,非阻塞模式下的套接字通道无法读取比套接字输入缓冲区立即可用的更多字节; 同样,文件通道不能读取比保留在文件中的字节更多的字节。 但是,如果一个通道处于阻塞模式并且至少有一个字节保留在缓冲区中,则该方法将被阻止,直到至少读取一个字节为止。
这个方法可以在任何时候调用。 然而,如果另一个线程已经在这个通道上启动了一个读操作,那么这个方法的调用将会阻塞,直到第一个操作完成。
Parameters | |
---|---|
dst |
ByteBuffer : The buffer into which bytes are to be transferred |
Returns | |
---|---|
int |
The number of bytes read, possibly zero, or -1 if the channel has reached end-of-stream |
Throws | |
---|---|
NotYetConnectedException |
If this channel is not yet connected |
IOException |
long read (ByteBuffer[] dsts)
从该通道读取一系列字节到给定的缓冲区中。
表单 c.read(dsts)的这种方法的调用的行为与调用完全相同
c.read(dsts, 0, dsts.length);
Parameters | |
---|---|
dsts |
ByteBuffer : The buffers into which bytes are to be transferred |
Returns | |
---|---|
long |
The number of bytes read, possibly zero, or -1 if the channel has reached end-of-stream |
Throws | |
---|---|
NotYetConnectedException |
If this channel is not yet connected |
IOException |
SocketChannel setOption (SocketOption<T> name, T value)
设置套接字选项的值。
Parameters | |
---|---|
name |
SocketOption : The socket option |
value |
T : The value of the socket option. A value of null may be a valid value for some socket options. |
Returns | |
---|---|
SocketChannel |
This channel |
Throws | |
---|---|
UnsupportedOperationException |
|
IllegalArgumentException |
|
ClosedChannelException |
|
IOException |
SocketChannel shutdownInput ()
关闭连接进行读取而不关闭通道。
一旦读取关机,则进一步读取该通道将返回-1
,即流结束指示。 如果连接的输入端已关闭,则调用此方法不起作用。
Returns | |
---|---|
SocketChannel |
The channel |
Throws | |
---|---|
NotYetConnectedException |
If this channel is not yet connected |
ClosedChannelException |
If this channel is closed |
IOException |
If some other I/O error occurs |
SocketChannel shutdownOutput ()
关闭连接写入而不关闭通道。
一旦写入关机,则进一步尝试写入该频道将抛出ClosedChannelException
。 如果连接的输出端已经关闭,则调用此方法不起作用。
Returns | |
---|---|
SocketChannel |
The channel |
Throws | |
---|---|
NotYetConnectedException |
If this channel is not yet connected |
ClosedChannelException |
If this channel is closed |
IOException |
If some other I/O error occurs |
Socket socket ()
检索与此通道关联的套接字。
返回的对象不会声明任何未在 Socket
类中声明的公共方法。
Returns | |
---|---|
Socket |
A socket associated with this channel |
int validOps ()
返回标识此频道支持的操作的操作集。
Socket通道支持连接,读取和写入,因此此方法返回 ( OP_CONNECT
| OP_READ
| OP_WRITE
) 。
Returns | |
---|---|
int |
The valid-operation set |
int write (ByteBuffer src)
从给定缓冲区中向此通道写入一个字节序列。
尝试写入最多 r个字节的通道,其中 r是缓冲区中剩余的字节数,即 src.remaining() ,此时调用此方法。
假设一个长度为n的字节序列被写入,其中0 <= n <= r 。 该字节序列将从索引p开始的缓冲区中传输,其中p是在调用此方法时缓冲区的位置; 写入的最后一个字节的索引将为p + n - 1 。 返回时,缓冲区的位置将等于p + n ; 其限制不会改变。
除非另有说明,否则只有在写入所有r请求的字节后才会返回写入操作。 根据其状态,某些类型的通道可能只写入一些字节或可能根本没有。 例如,非阻塞模式下的套接字通道不能写入比套接字输出缓冲区中的空闲字节更多的字节。
这个方法可以在任何时候调用。 但是,如果另一个线程已经在此通道上启动了写操作,则此方法的调用将会阻塞,直到第一个操作完成。
Parameters | |
---|---|
src |
ByteBuffer : The buffer from which bytes are to be retrieved |
Returns | |
---|---|
int |
The number of bytes written, possibly zero |
Throws | |
---|---|
NotYetConnectedException |
If this channel is not yet connected |
IOException |
long write (ByteBuffer[] srcs)
从给定的缓冲区中写入一个字节序列到这个通道。
表单 c.write(srcs)的此方法的调用的行为方式与调用完全相同
c.write(srcs, 0, srcs.length);
Parameters | |
---|---|
srcs |
ByteBuffer : The buffers from which bytes are to be retrieved |
Returns | |
---|---|
long |
The number of bytes written, possibly zero |
Throws | |
---|---|
NotYetConnectedException |
If this channel is not yet connected |
IOException |
long write (ByteBuffer[] srcs, int offset, int length)
从给定缓冲区的子序列向此通道写入一个字节序列。
试图向该通道写入多达 r个字节,其中 r是给定缓冲器阵列的指定子序列中剩余的字节总数,也就是说,
at the moment that this method is invoked.srcs[offset].remaining() + srcs[offset+1].remaining() + ... + srcs[offset+length-1].remaining()
假设写入长度为n的字节序列,其中0 <= n <= r 。 该序列的第一个srcs[offset].remaining()字节从缓冲区srcs[offset]被写入,直到接下来的srcs[offset+1].remaining()字节从缓冲区srcs[offset+1]等写入,直到整个字节序列被写入。 从每个缓冲区写入尽可能多的字节,因此每个更新缓冲区的最终位置(除了最后更新的缓冲区)都保证等于该缓冲区的限制。
除非另有说明,否则只有在写入所有r请求的字节后才会返回写入操作。 根据其状态,某些类型的通道可能只写入一些字节或可能根本没有。 例如,非阻塞模式下的套接字通道不能写入比套接字输出缓冲区中的空闲字节更多的字节。
这个方法可以在任何时候调用。 但是,如果另一个线程已经在此通道上启动了写操作,则此方法的调用将会阻塞,直到第一个操作完成。
Parameters | |
---|---|
srcs |
ByteBuffer : The buffers from which bytes are to be retrieved |
offset |
int : The offset within the buffer array of the first buffer from which bytes are to be retrieved; must be non-negative and no larger than srcs.length |
length |
int : The maximum number of buffers to be accessed; must be non-negative and no larger than srcs.length - offset |
Returns | |
---|---|
long |
The number of bytes written, possibly zero |
Throws | |
---|---|
NotYetConnectedException |
If this channel is not yet connected |
IOException |