Most visited

Recently visited

Added in API level 1

SocketChannel

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方法进行配置。 套接字通道支持以下选项:

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
Additional (implementation specific) options may also be supported.

套接字通道可安全地用于多个并发线程。 它们支持并发读写,尽管最多只有一个线程可能正在读取,并且在任何给定时间最多只有一个线程可能正在写入。 connectfinishConnect方法彼此相互同步,并且在调用其中一个方法的过程中尝试启动读取或写入操作将会阻塞,直到该调用完成。

Summary

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

Protected constructors

SocketChannel

Added in API level 1
SocketChannel (SelectorProvider provider)

初始化此类的新实例。

Parameters
provider SelectorProvider

Public methods

bind

Added in API level 24
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

connect

Added in API level 1
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

finishConnect

Added in API level 1
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

getRemoteAddress

Added in API level 24
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

isConnected

Added in API level 1
boolean isConnected ()

确定此通道的网络套接字是否已连接。

Returns
boolean true if, and only if, this channel's network socket is open and connected

isConnectionPending

Added in API level 1
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

open

Added in API level 1
SocketChannel open ()

打开套接字通道。

新通道是通过调用系统范围的默认 SelectorProvider对象的 openSocketChannel方法创建的。

Returns
SocketChannel A new socket channel
Throws
IOException If an I/O error occurs

open

Added in API level 1
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

read

Added in API level 1
long read (ByteBuffer[] dsts, 
                int offset, 
                int length)

从该通道读取一系列字节到给定缓冲区的子序列中。

此方法的调用尝试从该通道读取多达 r个字节,其中 r是给定缓冲区数组中指定子序列剩余的字节总数,也就是说,

 dsts[offset].remaining()
     + dsts[offset+1].remaining()
     + ... + dsts[offset+length-1].remaining()
at the moment that this method is invoked.

假设读取长度为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

read

Added in API level 1
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

read

Added in API level 1
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

setOption

Added in API level 24
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

shutdownInput

Added in API level 24
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

shutdownOutput

Added in API level 24
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

Added in API level 1
Socket socket ()

检索与此通道关联的套接字。

返回的对象不会声明任何未在 Socket类中声明的公共方法。

Returns
Socket A socket associated with this channel

validOps

Added in API level 1
int validOps ()

返回标识此频道支持的操作的操作集。

Socket通道支持连接,读取和写入,因此此方法返回 ( OP_CONNECT | OP_READ | OP_WRITE )

Returns
int The valid-operation set

write

Added in API level 1
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

write

Added in API level 1
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

write

Added in API level 1
long write (ByteBuffer[] srcs, 
                int offset, 
                int length)

从给定缓冲区的子序列向此通道写入一个字节序列。

试图向该通道写入多达 r个字节,其中 r是给定缓冲器阵列的指定子序列中剩余的字节总数,也就是说,

 srcs[offset].remaining()
     + srcs[offset+1].remaining()
     + ... + srcs[offset+length-1].remaining()
at the moment that this method is invoked.

假设写入长度为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

Hooray!