public abstract class SocketChannel extends AbstractSelectableChannel implements ByteChannel, ScatteringByteChannel, GatheringByteChannel, NetworkChannel
一个套接字通道是通过调用这个类的一个open
方法创建。它是不可能创建一个任意的,预先存在的插座的通道。一个新创建的套接字通道是打开的,但尚未连接。试图调用一个I/O操作在一个连接的通道会被NotYetConnectedException
。一个套接字通道可以通过调用其connect
方法连接;一旦连接,插座通道保持连接直到它关闭。是否一个套接字通道连接可以通过调用其isConnected
法测定。
插座的渠道支持非阻塞连接: 套接字通道可以被创建并建立链接到远程套接字过程可能发起的通过finishConnect
方法后完成的connect
方法。是否有一个连接操作在进行中可以通过调用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
方法相互同步互相对抗,并试图启动一个读或写操作,而其中的一个方法的调用过程中,调用将阻塞直到完成。
Modifier | Constructor and Description |
---|---|
protected |
SocketChannel(SelectorProvider provider)
初始化该类的一个新实例。
|
Modifier and Type | Method and Description |
---|---|
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)
写一个字节序列的子序列对该通道从给定的缓冲区。
|
blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register
register
begin, close, end, isOpen
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
getOption, supportedOptions
protected SocketChannel(SelectorProvider provider)
provider
-供应商,创造了这个频道
public static SocketChannel open() throws IOException
新的通道是由调用openSocketChannel
方法的默认SelectorProvider
对象。
IOException
如果I/O错误发生
public static SocketChannel open(SocketAddress remote) throws IOException
remote
-远程地址的新通道是连接
AsynchronousCloseException
如果另一个线程关闭通道,连接操作正在进行中
ClosedByInterruptException
如果另一个线程中断当前线程,连接操作正在进行中,从而关闭通道和设置当前线程的中断状态
UnresolvedAddressException
-如果给定的地址是不能完全解决
UnsupportedAddressTypeException
如果给定的远程地址的类型不支持
SecurityException
如果安全管理器已经安装,它不允许访问特定的远程端点
IOException
-如果其他I/O错误发生
public final int validOps()
插座渠道支撑连接,读,写,所以此方法返回(SelectionKey.OP_CONNECT
| SelectionKey.OP_READ
| SelectionKey.OP_WRITE
)。
validOps
方法重写,继承类
SelectableChannel
public abstract SocketChannel bind(SocketAddress local) throws IOException
NetworkChannel
此方法用于建立套接字和本地地址之间的关联。一旦一个关联建立,那么套接字保持绑定,直到通道关闭。如果local
参数的值null
然后插座将绑定到一个地址的自动分配。
bind
接口
NetworkChannel
local
-地址绑定套接字,或者
null
绑定socket套接字地址的自动分配
ConnectionPendingException
-如果一个非阻塞连接操作已在进行中在这个频道
AlreadyBoundException
如果插座已绑定
UnsupportedAddressTypeException
如果给定的地址的类型不支持
ClosedChannelException
如果通道关闭
IOException
-如果其他I/O错误发生
SecurityException
-如果一个安全管理已安装的
checkListen
否认操作方法
NetworkChannel.getLocalAddress()
public abstract <T> SocketChannel setOption(SocketOption<T> name, T value) throws IOException
NetworkChannel
setOption
接口
NetworkChannel
T
的套接字选项的值的类型
name
的套接字选项
value
-套接字选项的值。一个价值
null
可能对于一些套接字选项的有效值。
UnsupportedOperationException
如果套接字选项不支持这个频道
IllegalArgumentException
-如果值不是此套接字选项的有效值
ClosedChannelException
-如果这通道关闭
IOException
如果I/O错误发生
StandardSocketOptions
public abstract SocketChannel shutdownInput() throws IOException
一旦停止阅读然后再读取通道将返回-1
,流指示结束。如果连接的输入端已经关闭,则调用该方法没有效果。
NotYetConnectedException
-如果这个通道没有连接
ClosedChannelException
-如果这通道关闭
IOException
-如果其他I/O错误发生
public abstract SocketChannel shutdownOutput() throws IOException
一旦关机写作进而试图写入通道将把ClosedChannelException
。如果连接的输出端已经关闭,则调用该方法没有效果。
NotYetConnectedException
-如果这个通道没有连接
ClosedChannelException
-如果这通道关闭
IOException
-如果其他I/O错误发生
public abstract boolean isConnected()
open
连接
public abstract boolean isConnectionPending()
finishConnect
方法尚未完成启动
public abstract boolean connect(SocketAddress remote) throws IOException
如果此通道处于非阻塞模式,则此方法的调用将启动一个非阻塞连接操作。如果立即建立起连接,可以用本地连接发生,那么这个方法返回true。否则,此方法返回false和连接操作必须通过调用方法完成finishConnect
。
如果此通道处于阻塞模式,则此方法的调用将阻塞,直到建立连接或发生I / O错误。
该方法具有完全相同的安全检查,为Socket
类。那就是,如果一个安全管理已安装此方法验证其checkConnect
方法允许连接的地址和端口号指定远程端点。
这种方法可能在任何时候被调用。如果在这个通道上的读或写操作被调用,而这个方法的调用是在进步,那么该操作将第一个块,直到这个调用完成。如果启动了连接尝试,但失败了,也就是说,如果一个调用这个方法抛出一个异常,那么这个通道将被关闭。
remote
-远程地址,这个通道是连接
AlreadyConnectedException
-如果这个通道已经连接
ConnectionPendingException
-如果一个非阻塞连接操作已在进行中在这个频道
ClosedChannelException
-如果这通道关闭
AsynchronousCloseException
如果另一个线程关闭通道,连接操作正在进行中
ClosedByInterruptException
如果另一个线程中断当前线程,连接操作正在进行中,从而关闭通道和设置当前线程的中断状态
UnresolvedAddressException
-如果给定的地址是不能完全解决
UnsupportedAddressTypeException
如果给定的远程地址的类型不支持
SecurityException
如果安全管理器已经安装,它不允许访问特定的远程端点
IOException
-如果其他I/O错误发生
public abstract boolean finishConnect() throws IOException
一个非阻塞的连接操作是通过放置一个套接字通道在非阻塞模式,然后调用它的方法开始connect
。一旦建立连接,或尝试失败,套接字通道将成为连接,这种方法可以被调用来完成连接顺序。如果连接操作失败,则调用该方法会导致一个适当的IOException
被。
如果这个通道已经连接此方法不会阻止将立即返回true。如果这个渠道是非阻塞模式,然后将这一方法如果连接过程尚未完成,返回false。如果这个通道阻塞模式然后方法将阻塞直到连接或者完成或者失败,永远也true返回或抛出异常的故障描述。
这种方法可能在任何时候被调用。如果在这个通道上的读或写操作被调用,而这个方法的调用是在进步,那么该操作将第一个块,直到这个调用完成。如果一个连接尝试失败,也就是说,如果一个调用这个方法抛出一个被选中的异常,那么该通道将被关闭。
NoConnectionPendingException
-如果这通道没有连接和连接操作尚未启动
ClosedChannelException
-如果这通道关闭
AsynchronousCloseException
如果另一个线程关闭通道,连接操作正在进行中
ClosedByInterruptException
如果另一个线程中断当前线程,连接操作正在进行中,从而关闭通道和设置当前线程的中断状态
IOException
-如果其他I/O错误发生
public abstract SocketAddress getRemoteAddress() throws IOException
在信道绑定和连接到一个网络协议的套接字地址然后从这个方法返回值的类型是InetSocketAddress
。
null
如果信道的套接字没有连接
ClosedChannelException
如果通道关闭
IOException
如果I/O错误发生
public abstract int read(ByteBuffer dst) throws IOException
ReadableByteChannel
尝试读到R字节从通道,其中R为剩余的缓冲区中的字节数,即dst.remaining(),目前这个方法被调用。
假设一个长度字节序列N是阅读,在0 <= N <= R.这个字节序列将被转移到缓冲区,序列中的第一个字节在指数P和最后一个字节在指数P + N - 1,其中P是缓冲区的位置,目前这个方法被调用。在返回的缓冲区的位置将等于P + N;极限将不会改变。
一个读操作可能无法填充缓冲区,事实上它可能根本没有读过任何字节。它是否这样做取决于通道的性质和状态。例如,在非阻塞模式下的套接字通道不能读取比套接字的输入缓冲器立即可用的更多的字节;同样,一个文件通道不能读取任何大于保持在文件中的字节数。它是保证,但是,如果一个通道是在阻塞模式,并有至少一个字节留在缓冲区,那么这种方法将阻止,直到至少一个字节读取。
这种方法可能在任何时候被调用。如果另一个线程已经在这个通道上启动了一个读操作,那么这个方法的调用将阻塞,直到第一个操作完成。
read
接口
ReadableByteChannel
dst
-缓冲区中的字节都被转移
NotYetConnectedException
-如果这个通道没有连接
ClosedChannelException
-如果这通道关闭
AsynchronousCloseException
如果另一个线程关闭通道而读操作正在进行中
ClosedByInterruptException
如果另一个线程中断当前线程在读操作中,从而关闭通道和设置当前线程的中断状态
IOException
-如果其他I/O错误发生
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],等等,直到整个字节序列转换为给定的缓冲区。尽可能多的字节被传送到每个缓冲区,因此每个更新的缓冲区的最终位置,除了最后一个更新的缓冲区,保证是等于该缓冲区的限制。
这种方法可能在任何时候被调用。如果另一个线程已经在这个通道上启动了一个读操作,那么这个方法的调用将阻塞,直到第一个操作完成。
read
接口
ScatteringByteChannel
dsts
的缓冲区字节被转移
offset
-在第一缓冲区中的字节将缓冲数组的偏移;必须是非负的且不大于
dsts.length
length
-缓冲区的最大数量被访问;必须是非负的且不大于
dsts.length -
offset
NotYetConnectedException
-如果这个通道没有连接
ClosedChannelException
-如果这通道关闭
AsynchronousCloseException
如果另一个线程关闭通道而读操作正在进行中
ClosedByInterruptException
如果另一个线程中断当前线程在读操作中,从而关闭通道和设置当前线程的中断状态
IOException
-如果其他I/O错误发生
public final long read(ByteBuffer[] dsts) throws IOException
ScatteringByteChannel
这种形式的c.read(dsts)方法调用的行为以同样的方式调用
c.read(dsts, 0, dsts.length);
read
接口
ScatteringByteChannel
dsts
的缓冲区字节被转移
NotYetConnectedException
-如果这个通道没有连接
ClosedChannelException
-如果这通道关闭
AsynchronousCloseException
如果另一个线程关闭通道而读操作正在进行中
ClosedByInterruptException
如果另一个线程中断当前线程在读操作中,从而关闭通道和设置当前线程的中断状态
IOException
-如果其他I/O错误发生
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请求字节。某些类型的信道,根据它们的状态,可以只写一些字节或可能没有一个。例如,在非阻塞模式下的套接字通道不能写入任何大于在套接字输出缓冲区中的字节数的字节数。
这种方法可能在任何时候被调用。如果另一个线程已经在这个通道上启动了一个写操作,那么这个方法的调用将阻塞,直到第一个操作完成。
write
接口
WritableByteChannel
src
-缓冲器字节进行检索
NotYetConnectedException
-如果这个通道没有连接
ClosedChannelException
-如果这通道关闭
AsynchronousCloseException
如果另一个线程关闭通道,而写操作正在进行中
ClosedByInterruptException
如果另一个线程中断当前线程,而写操作正在进行,从而关闭通道和设置当前线程的中断状态
IOException
-如果其他I/O错误发生
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].remaining()字节被写入缓冲srcs[offset],到下一个srcs[offset+1].remaining()字节被写入缓冲区srcs[offset+1],等等,直到整个字节顺序写。尽可能多的字节是从每个缓冲区写的,因此每个更新的缓冲区的最终位置,除了最后一个更新的缓冲区,保证是等于该缓冲区的限制。
除非另有规定,一个写操作将返回后,才写所有的R请求字节。某些类型的信道,根据它们的状态,可以只写一些字节或可能没有一个。例如,在非阻塞模式下的套接字通道不能写入任何大于在套接字输出缓冲区中的字节数的字节数。
这种方法可能在任何时候被调用。如果另一个线程已经在这个通道上启动了一个写操作,那么这个方法的调用将阻塞,直到第一个操作完成。
write
接口
GatheringByteChannel
srcs
的缓冲区字节进行检索
offset
-在第一缓冲区字节进行检索缓冲数组的偏移;必须是非负的且不大于
srcs.length
length
-缓冲区的最大数量被访问;必须是非负的且不大于
srcs.length -
offset
NotYetConnectedException
-如果这个通道没有连接
ClosedChannelException
-如果这通道关闭
AsynchronousCloseException
如果另一个线程关闭通道,而写操作正在进行中
ClosedByInterruptException
如果另一个线程中断当前线程,而写操作正在进行,从而关闭通道和设置当前线程的中断状态
IOException
-如果其他I/O错误发生
public final long write(ByteBuffer[] srcs) throws IOException
GatheringByteChannel
这种形式的c.write(srcs)方法调用的行为以同样的方式调用
c.write(srcs, 0, srcs.length);
write
接口
GatheringByteChannel
srcs
的缓冲区字节进行检索
NotYetConnectedException
-如果这个通道没有连接
ClosedChannelException
-如果这通道关闭
AsynchronousCloseException
如果另一个线程关闭通道,而写操作正在进行中
ClosedByInterruptException
如果另一个线程中断当前线程,而写操作正在进行,从而关闭通道和设置当前线程的中断状态
IOException
-如果其他I/O错误发生
public abstract SocketAddress getLocalAddress() throws IOException
在渠道bound
到互联网协议的套接字地址然后从这个方法返回值的类型是InetSocketAddress
。
如果存在安全管理器,它的checkConnect
方法被调用的本地地址和-1
作为它的参数看看操作是允许的。如果操作是不允许的,一个SocketAddress
代表loopback
地址和本地端口的套接字通道返回。
getLocalAddress
接口
NetworkChannel
SocketAddress
,socket,或
SocketAddress
代表回送地址如果由安全经理否认,或
null
如果信道的插座是不受约束的
ClosedChannelException
如果通道关闭
IOException
如果I/O错误发生
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.