- java.lang.Object
-
- java.nio.channels.spi.AbstractInterruptibleChannel
-
- java.nio.channels.SelectableChannel
-
- java.nio.channels.spi.AbstractSelectableChannel
-
- java.nio.channels.SocketChannel
-
- 实现的所有接口
-
Closeable
,AutoCloseable
,ByteChannel
,Channel
,GatheringByteChannel
,InterruptibleChannel
,NetworkChannel
,ReadableByteChannel
,ScatteringByteChannel
,WritableByteChannel
public abstract class SocketChannel extends AbstractSelectableChannel implements ByteChannel, ScatteringByteChannel, GatheringByteChannel, NetworkChannel
用于面向流的连接套接字的可选通道。通过调用此类的
open
方法之一来创建套接字通道。 无法为任意预先存在的套接字创建通道。 新创建的套接字通道已打开但尚未连接。 尝试在未连接的通道上调用I / O操作将导致抛出NotYetConnectedException
。 可以通过调用其connect
方法连接套接字通道; 连接后,插座通道保持连接状态,直到它关闭。 无论是否连接的套接字通道可通过调用其来确定isConnected
方法。套接字通道支持非阻塞连接:可以创建套接字通道,并且可以通过
connect
方法启动建立到远程套接字的链接的过程,以便稍后通过finishConnect
方法完成。 是否正在进行连接操作可以通过调用isConnectionPending
方法来确定。套接字通道支持异步关闭,这类似于
Channel
类中指定的异步关闭操作。 如果套接字的输入端被一个线程关闭而另一个线程在套接字通道上的读操作中被阻塞,则被阻塞线程中的读操作将完成而不读取任何字节并将返回-1
。 如果套接字的输出端被一个线程关闭而另一个线程在套接字通道上的写操作中被阻塞, 则被阻塞的线程将收到AsynchronousCloseException
。使用
setOption
方法配置套接字选项。 套接字通道支持以下选项: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
方法彼此相互同步,并且在调用其中一个方法的同时尝试启动读取或写入操作将阻塞,直到该调用完成。- 从以下版本开始:
- 1.4
-
-
构造方法摘要
构造方法 变量 构造器 描述 protected
SocketChannel(SelectorProvider provider)
初始化此类的新实例。
-
方法摘要
所有方法 静态方法 实例方法 抽象方法 具体的方法 变量和类型 方法 描述 abstract SocketChannel
bind(SocketAddress local)
将通道的套接字绑定到本地地址。abstract boolean
connect(SocketAddress remote)
连接此通道的插座。abstract boolean
finishConnect()
完成连接套接字通道的过程。abstract SocketAddress
getLocalAddress()
返回此通道的套接字绑定的套接字地址。abstract SocketAddress
getRemoteAddress()
返回此通道的套接字连接的远程地址。abstract boolean
isConnected()
判断此通道的网络插座是否已连接。abstract boolean
isConnectionPending()
判断此通道上的连接操作是否正在进行中。static SocketChannel
open()
打开套接字通道。static SocketChannel
open(SocketAddress remote)
打开套接字通道并将其连接到远程地址。abstract int
read(ByteBuffer dst)
从该通道读取一个字节序列到给定的缓冲区。long
read(ByteBuffer[] dsts)
从该通道读取一系列字节到给定的缓冲区。abstract long
read(ByteBuffer[] dsts, int offset, int length)
从该通道读取一系列字节到给定缓冲区的子序列。abstract <T> SocketChannel
setOption(SocketOption<T> name, T value)
设置套接字选项的值。abstract SocketChannel
shutdownInput()
在不关闭通道的情况下关闭连接以进行读取。abstract SocketChannel
shutdownOutput()
在不关闭通道的情况下关闭连接以进行写入。abstract Socket
socket()
检索与此通道关联的套接字。int
validOps()
返回标识此通道支持的操作的操作集。abstract int
write(ByteBuffer src)
从给定缓冲区向该通道写入一个字节序列。long
write(ByteBuffer[] srcs)
从给定的缓冲区向该通道写入一个字节序列。abstract long
write(ByteBuffer[] srcs, int offset, int length)
从给定缓冲区的子序列向该通道写入一个字节序列。-
声明方法的类 java.nio.channels.spi.AbstractSelectableChannel
configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, provider, register
-
声明方法的类 java.nio.channels.SelectableChannel
blockingLock, isBlocking, isRegistered, keyFor, register
-
声明方法的类 java.nio.channels.spi.AbstractInterruptibleChannel
begin, close, end
-
声明方法的类 java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
声明方法的接口 java.nio.channels.NetworkChannel
getOption, supportedOptions
-
-
-
-
构造方法详细信息
-
SocketChannel
protected SocketChannel(SelectorProvider provider)
初始化此类的新实例。- 参数
-
provider
- 创建此频道的提供商
-
-
方法详细信息
-
open
public static SocketChannel open() throws IOException
打开套接字通道。通过调用系统范围的默认
SelectorProvider
对象的openSocketChannel
方法来创建新通道。- 结果
- 一个新的套接字通道
- 异常
-
IOException
- 如果发生I / O错误
-
open
public static SocketChannel open(SocketAddress remote) throws IOException
- 参数
-
remote
- 新通道要连接的远程地址 - 结果
- 一个新的连接套接字通道
- 异常
-
AsynchronousCloseException
- 如果另一个线程在连接操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在连接操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
UnresolvedAddressException
- 如果给定的远程地址未完全解析 -
UnsupportedAddressTypeException
- 如果不支持给定远程地址的类型 -
SecurityException
- 如果已安装安全管理器且不允许访问给定的远程端点 -
IOException
- 如果发生其他一些I / O错误
-
validOps
public final int validOps()
返回标识此通道支持的操作的操作集。套接字通道支持连接,读取和写入,因此该方法返回
(
SelectionKey.OP_CONNECT
|
SelectionKey.OP_READ
|
SelectionKey.OP_WRITE
)
。- Specified by:
-
validOps
在类SelectableChannel
- 结果
- 有效操作集
-
bind
public abstract SocketChannel bind(SocketAddress local) throws IOException
从界面复制的说明:NetworkChannel
将通道的套接字绑定到本地地址。此方法用于在套接字和本地地址之间建立关联。 一旦建立关联,则套接字保持绑定直到通道关闭。 如果
local
参数的值为null
则套接字将绑定到自动分配的地址。- Specified by:
-
bind
在NetworkChannel
- 参数
-
local
- 绑定套接字的地址,或null
将套接字绑定到自动分配的套接字地址 - 结果
- 这个频道
- 异常
-
ConnectionPendingException
- 如果此通道上的非阻塞连接操作已在进行中 -
AlreadyBoundException
- 如果套接字已绑定 -
UnsupportedAddressTypeException
- 如果不支持给定地址的类型 -
ClosedChannelException
- 如果频道已关闭 -
IOException
- 如果发生其他一些I / O错误 -
SecurityException
- 如果已安装安全管理器且其checkListen
方法拒绝操作 - 从以下版本开始:
- 1.7
- 另请参见:
-
NetworkChannel.getLocalAddress()
-
setOption
public abstract <T> SocketChannel setOption(SocketOption<T> name, T value) throws IOException
从界面复制的说明:NetworkChannel
设置套接字选项的值。- Specified by:
-
setOption
在接口NetworkChannel
- 参数类型
-
T
- 套接字选项值的类型 - 参数
-
name
- 套接字选项 -
value
- 套接字选项的值。 值null
可能是某些套接字选项的有效值。 - 结果
- 这个频道
- 异常
-
UnsupportedOperationException
- 如果此通道不支持套接字选项 -
IllegalArgumentException
- 如果该值不是此套接字选项的有效值 -
ClosedChannelException
- 如果此渠道已关闭 -
IOException
- 如果发生I / O错误 - 从以下版本开始:
- 1.7
- 另请参见:
-
StandardSocketOptions
-
shutdownInput
public abstract SocketChannel shutdownInput() throws IOException
在不关闭通道的情况下关闭连接以进行读取。一旦关闭读取,则进一步读取通道将返回
-1
,即流结束指示。 如果连接的输入端已经关闭,则调用此方法无效。- 结果
- 这个频道
- 异常
-
NotYetConnectedException
- 如果此频道尚未连接 -
ClosedChannelException
- 如果此频道已关闭 -
IOException
- 如果发生其他一些I / O错误 - 从以下版本开始:
- 1.7
-
shutdownOutput
public abstract SocketChannel shutdownOutput() throws IOException
在不关闭通道的情况下关闭连接以进行写入。一旦关闭写入,则进一步尝试写入通道将抛出
ClosedChannelException
。 如果连接的输出端已经关闭,则调用此方法无效。- 结果
- 这个频道
- 异常
-
NotYetConnectedException
- 如果此通道尚未连接 -
ClosedChannelException
- 如果此频道已关闭 -
IOException
- 如果发生其他一些I / O错误 - 从以下版本开始:
- 1.7
-
isConnected
public abstract boolean isConnected()
判断此通道的网络插座是否已连接。- 结果
-
true
当且仅当此通道的网络插座为open
且已连接
-
isConnectionPending
public abstract boolean isConnectionPending()
判断此通道上的连接操作是否正在进行中。- 结果
-
true
当且仅当在此通道上启动了连接操作但尚未通过调用finishConnect
方法完成
-
connect
public abstract boolean connect(SocketAddress remote) throws IOException
连接此通道的插座。如果此通道处于非阻塞模式,则调用此方法将启动非阻塞连接操作。 如果立即建立连接(如本地连接可能发生),则此方法返回
true
。 否则,此方法返回false
,稍后必须通过调用finishConnect
方法完成连接操作。如果此通道处于阻塞模式,则此方法的调用将阻塞,直到建立连接或发生I / O错误。
此方法执行与
Socket
类完全相同的安全检查。 也就是说,如果安装了安全管理器,则此方法将验证其checkConnect
方法是否允许连接到给定远程端点的地址和端口号。可以随时调用此方法。 如果在调用此方法的同时调用此通道上的读取或写入操作,则该操作将首先阻塞,直到此调用完成。 如果连接尝试已启动但失败,即,如果此方法的调用抛出已检查的异常,则将关闭该通道。
- 参数
-
remote
- 此通道要连接的远程地址 - 结果
-
true
如果建立了连接,false
如果此通道处于非阻塞模式且连接操作正在进行中 - 异常
-
AlreadyConnectedException
- 如果此通道已连接 -
ConnectionPendingException
- 如果此通道上的非阻塞连接操作正在进行中 -
ClosedChannelException
- 如果此频道已关闭 -
AsynchronousCloseException
- 如果另一个线程在连接操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在连接操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
UnresolvedAddressException
- 如果给定的远程地址未完全解析 -
UnsupportedAddressTypeException
- 如果不支持给定远程地址的类型 -
SecurityException
- 如果已安装安全管理器且不允许访问给定的远程端点 -
IOException
- 如果发生其他一些I / O错误
-
finishConnect
public abstract boolean finishConnect() throws IOException
完成连接套接字通道的过程。通过将套接字通道置于非阻塞模式然后调用其
connect
方法来启动非阻塞连接操作。 一旦建立连接或尝试失败,套接字通道将变为可连接,并且可以调用此方法来完成连接序列。 如果连接操作失败,则调用此方法将导致引发适当的IOException
。如果此通道已连接,则此方法不会阻止,并将立即返回
true
。 如果此通道处于非阻塞模式,则如果连接过程尚未完成,则此方法将返回false
。 如果此通道处于阻塞模式,则此方法将阻塞,直到连接完成或失败,并始终返回true
或抛出描述失败的已检查异常。可以随时调用此方法。 如果在调用此方法的同时调用此通道上的读取或写入操作,则该操作将首先阻塞,直到此调用完成。 如果连接尝试失败,即,如果此方法的调用抛出已检查的异常,则将关闭该通道。
- 结果
-
true
当且仅当此通道的套接字现在已连接时 - 异常
-
NoConnectionPendingException
- 如果未连接此通道且尚未启动连接操作 -
ClosedChannelException
- 如果此频道已关闭 -
AsynchronousCloseException
- 如果另一个线程在连接操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在连接操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他一些I / O错误
-
getRemoteAddress
public abstract SocketAddress getRemoteAddress() throws IOException
返回此通道的套接字连接的远程地址。如果通道绑定并连接到Internet协议套接字地址,则此方法的返回值的类型为
InetSocketAddress
。- 结果
-
远程地址;
null
如果未连接通道的插座 - 异常
-
ClosedChannelException
- 如果频道已关闭 -
IOException
- 如果发生I / O错误 - 从以下版本开始:
- 1.7
-
read
public abstract int read(ByteBuffer dst) throws IOException
从界面复制的说明:ReadableByteChannel
从该通道读取一个字节序列到给定的缓冲区。尝试从通道读取最多r个字节,其中r是缓冲区中剩余的字节数,即
dst.remaining()
,此时调用此方法。假设读取长度为n的字节序列,其中
0
<=
n<=
r 。 该字节序列将被传送到缓冲区,以便序列中的第一个字节位于索引p ,最后一个字节位于索引p+
n-
1
,其中p是调用此方法时缓冲区的位置。 返回时,缓冲区的位置将等于p+
n ; 它的限制不会改变。读操作可能不会填充缓冲区,实际上它根本不会读取任何字节。 它是否这样做取决于渠道的性质和状态。 例如,处于非阻塞模式的套接字通道不能读取比套接字输入缓冲区中立即可用的字节数更多的字节数。 类似地,文件通道不能再读取保留在文件中的字节数。 但是,可以保证,如果通道处于阻塞模式且缓冲区中至少剩余一个字节,则此方法将阻塞,直到读取至少一个字节。
可以随时调用此方法。 但是,如果另一个线程已经在此通道上启动了读操作,则此方法的调用将阻塞,直到第一个操作完成。
- Specified by:
-
read
,界面ReadableByteChannel
- 参数
-
dst
- 要传输字节的缓冲区 - 结果
-
读取的字节数,可能为零,如果通道已到达流末尾,
-1
- 异常
-
NotYetConnectedException
- 如果此通道尚未连接 -
ClosedChannelException
- 如果此渠道已关闭 -
AsynchronousCloseException
- 如果另一个线程在读取操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在读操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他一些I / O错误
-
read
public abstract long read(ByteBuffer[] dsts, int offset, int length) throws IOException
从界面复制的说明:ScatteringByteChannel
从该通道读取一系列字节到给定缓冲区的子序列。调用此方法会尝试从此通道读取最多r个字节,其中r是给定缓冲区数组的指定子序列剩余的总字节数,即
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]
,依此类推,直到整个字节序列被传送到给定的缓冲器中。 尽可能多的字节传输到每个缓冲区,因此每个更新缓冲区的最终位置(最后更新的缓冲区除外)保证等于该缓冲区的限制。可以随时调用此方法。 但是,如果另一个线程已经在此通道上启动了读操作,则此方法的调用将阻塞,直到第一个操作完成。
- Specified by:
-
read
,接口ScatteringByteChannel
- 参数
-
dsts
- 要传输字节的缓冲区 -
offset
- 要传输字节的第一个缓冲区的缓冲区数组内的偏移量; 必须是非负数且不大于dsts.length
-
length
- 要访问的最大缓冲区数; 必须是非负数且不大于dsts.length
-offset
- 结果
-
如果通道已到达流末尾,则读取的字节数(可能为零)或
-1
- 异常
-
NotYetConnectedException
- 如果此频道尚未连接 -
ClosedChannelException
- 如果此渠道已关闭 -
AsynchronousCloseException
- 如果另一个线程在读操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在读操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他一些I / O错误
-
read
public final long read(ByteBuffer[] dsts) throws IOException
从界面复制的说明:ScatteringByteChannel
从该通道读取一系列字节到给定的缓冲区。调用
c.read(dsts)
形式的此方法的行为与调用的方式完全相同c.read(dsts, 0, dsts.length);
- Specified by:
-
read
在接口ScatteringByteChannel
- 参数
-
dsts
- 要传输字节的缓冲区 - 结果
-
如果通道已到达流末尾,则读取的字节数(可能为零)或
-1
- 异常
-
NotYetConnectedException
- 如果此通道尚未连接 -
ClosedChannelException
- 如果此渠道已关闭 -
AsynchronousCloseException
- 如果另一个线程在读操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在读操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他一些I / O错误
-
write
public abstract int write(ByteBuffer src) throws IOException
从界面复制的说明:WritableByteChannel
从给定缓冲区向该通道写入一个字节序列。尝试向通道写入最多r个字节,其中r是缓冲区中剩余的字节数,即
src.remaining()
,此时调用此方法。假设写入长度为n的字节序列,其中
0
<=
n<=
r 。 该字节序列将从索引p开始从缓冲区传输,其中p是调用此方法时缓冲区的位置; 写入的最后一个字节的索引将是p+
n-
1
。 返回时,缓冲区的位置将等于p+
n ; 它的限制不会改变。除非另有说明,否则只有在写入所有r请求的字节后才会返回写操作。 某些类型的通道(取决于它们的状态)可能只写入一些字节,或者根本不写。 例如,处于非阻塞模式的套接字通道不能再写入套接字输出缓冲区中可用的字节数。
可以随时调用此方法。 但是,如果另一个线程已经在此通道上启动了写操作,则此方法的调用将阻塞,直到第一个操作完成。
- Specified by:
-
write
在WritableByteChannel
- 参数
-
src
- 要从中检索字节的缓冲区 - 结果
- 写入的字节数,可能为零
- 异常
-
NotYetConnectedException
- 如果此频道尚未连接 -
ClosedChannelException
- 如果此频道已关闭 -
AsynchronousCloseException
- 如果另一个线程在写操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他一些I / O错误
-
write
public abstract long write(ByteBuffer[] srcs, int offset, int length) throws IOException
从界面复制的说明:GatheringByteChannel
从给定缓冲区的子序列向该通道写入一个字节序列。尝试向该通道写入最多r个字节,其中r是给定缓冲区数组的指定子序列中剩余的总字节数,即
srcs[offset].remaining() + srcs[offset+1].remaining() + ... + srcs[offset+length-1].remaining()
假设写入长度为n的字节序列,其中
0
<=
n<=
r 。 直到从缓冲区srcs[offset]
写入该序列的前srcs[offset].remaining()
字节,直到从缓冲区srcs[offset+1]
写入下一个srcs[offset+1].remaining()
字节,依此类推,直到写入整个字节序列。 从每个缓冲区写入尽可能多的字节,因此每个更新缓冲区的最终位置(最后更新的缓冲区除外)保证等于该缓冲区的限制。除非另有说明,否则只有在写入所有r请求的字节后才会返回写操作。 某些类型的通道(取决于它们的状态)可能只写入一些字节,或者根本不写。 例如,处于非阻塞模式的套接字通道不能再写入套接字输出缓冲区中可用的字节数。
可以随时调用此方法。 但是,如果另一个线程已经在此通道上启动了写操作,则此方法的调用将阻塞,直到第一个操作完成。
- Specified by:
-
write
,界面GatheringByteChannel
- 参数
-
srcs
- 要从中检索字节的缓冲区 -
offset
- 要从中检索字节的第一个缓冲区的缓冲区数组中的偏移量; 必须是非负数且不大于srcs.length
-
length
- 要访问的最大缓冲区数; 必须是非负数且不大于srcs.length
-offset
- 结果
- 写入的字节数,可能为零
- 异常
-
NotYetConnectedException
- 如果此通道尚未连接 -
ClosedChannelException
- 如果此频道已关闭 -
AsynchronousCloseException
- 如果另一个线程在写操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他一些I / O错误
-
write
public final long write(ByteBuffer[] srcs) throws IOException
从界面复制的说明:GatheringByteChannel
从给定的缓冲区向该通道写入一个字节序列。调用
c.write(srcs)
形式的此方法的行为与调用的方式完全相同c.write(srcs, 0, srcs.length);
- Specified by:
-
write
在接口GatheringByteChannel
- 参数
-
srcs
- 要从中检索字节的缓冲区 - 结果
- 写入的字节数,可能为零
- 异常
-
NotYetConnectedException
- 如果此通道尚未连接 -
ClosedChannelException
- 如果此频道已关闭 -
AsynchronousCloseException
- 如果另一个线程在写操作正在进行时关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在写操作正在进行时中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他一些I / O错误
-
getLocalAddress
public abstract SocketAddress getLocalAddress() throws IOException
返回此通道的套接字绑定的套接字地址。如果通道是
bound
到Internet协议套接字地址,则此方法的返回值是InetSocketAddress
类型。如果存在安全管理器集,则使用本地地址和
-1
作为其参数调用其checkConnect
方法,以查看是否允许该操作。 如果不允许该操作,则SocketAddress
表示loopback
地址的SocketAddress和通道套接字的本地端口。- Specified by:
-
getLocalAddress
in interfaceNetworkChannel
- 结果
-
该
SocketAddress
这套接字绑定到,或SocketAddress
代表的环回地址,如果安全管理器拒绝,或null
如果通道的套接字不绑定 - 异常
-
ClosedChannelException
- 如果频道已关闭 -
IOException
- 如果发生I / O错误
-
-