所有类


java.nio.channels
类 SocketChannel

java.lang.Object
  继承者 java.nio.channels.spi.AbstractInterruptibleChannel
      继承者 java.nio.channels.SelectableChannel
          继承者 java.nio.channels.spi.AbstractSelectableChannel
              继承者 java.nio.channels.SocketChannel
所有已实现的接口:
Closeable, ByteChannel, Channel, GatheringByteChannel, InterruptibleChannel, ReadableByteChannel, ScatteringByteChannel, WritableByteChannel

public abstract class SocketChannel
   
   
   
   
   
extends AbstractSelectableChannel
implements ByteChannel, ScatteringByteChannel, GatheringByteChannel

针对面向流的连接套接字的可选择通道。

套接字通道不是连接网络套接字的完整抽象。必须通过调用 socket 方法所获得的关联 Socket 对象来完成对套接字选项的绑定、关闭和操作。不可能为任意的已有套接字创建通道,也不可能指定与套接字通道关联的套接字所使用的 SocketImpl 对象。

通过调用此类的某个 open 方法创建套接字通道。新创建的套接字通道已打开,但尚未连接。试图在未连接的通道上调用 I/O 操作将导致抛出 NotYetConnectedException。可通过调用套接字通道的 connect 方法连接该通道;一旦连接后,关闭套接字通道之前它会一直保持已连接状态。可通过调用套接字通道的 isConnected 方法来确定套接字通道是否已连接。

套接字通道支持非阻塞连接:可创建一个套接字通道,并且通过 connect 方法可以发起到远程套接字的连接,之后通过 finishConnect 方法完成该连接。可通过调用 isConnectionPending 方法来确定是否正在进行连接操作。

可单独地关闭 套接字通道的输入端和输出端,而无需实际关闭该通道。调用关联套接字对象的 shutdownInput 方法来关闭某个通道的输入端将导致该通道上的后续读取操作返回 -1(指示流的末尾)。调用关联套接字对象的 shutdownOutput 方法来关闭通道的输出端将导致该通道上的后续写入操作抛出 ClosedChannelException

套接字通道支持异步关闭,这与 Channel 类中所指定的异步 close 操作类似。如果一个线程关闭了某个套接字的输入端,而同时另一个线程被阻塞在该套接字通道上的读取操作中,那么处于阻塞线程中的读取操作将完成,而不读取任何字节且返回 -1。I如果一个线程关闭了某个套接字的输出端,而同时另一个线程被阻塞在该套接字通道上的写入操作中,那么阻塞线程将收到 AsynchronousCloseException

多个并发线程可安全地使用套接字通道。尽管在任意给定时刻最多只能有一个线程进行读取和写入操作,但数据报通道支持并发的读写。connectfinishConnect 方法是相互同步的,如果正在调用其中某个方法的同时试图发起读取或写入操作,则在该调用完成之前该操作被阻塞。

从以下版本开始:
1.4

构造方法摘要
protected SocketChannel(SelectorProvider provider)
          初始化此类的一个新实例。
 
方法摘要
abstract  booleanconnect(SocketAddress remote)
          连接此通道的套接字。
abstract  booleanfinishConnect()
          完成套接字通道的连接过程。
abstract  booleanisConnected()
          判断是否已连接此通道的网络套接字。
abstract  booleanisConnectionPending()
          判断此通道上是否正在进行连接操作。
static SocketChannelopen()
          打开套接字通道。
static SocketChannelopen(SocketAddress remote)
          打开套接字通道并将其连接到远程地址。
abstract  intread(ByteBuffer dst)
          将字节序列从此通道中读入给定的缓冲区。
 longread(ByteBuffer[] dsts)
          将字节序列从此通道读入给定的缓冲区。
abstract  longread(ByteBuffer[] dsts, int offset, int length)
          将字节序列从此通道读入给定缓冲区的子序列中。
abstract  Socketsocket()
          检索与此通道关联的套接字。
 intvalidOps()
          返回一个操作集,标识此通道所支持的操作。
abstract  intwrite(ByteBuffer src)
          将字节序列从给定的缓冲区中写入此通道。
 longwrite(ByteBuffer[] srcs)
          将字节序列从给定的缓冲区写入此通道。
abstract  longwrite(ByteBuffer[] srcs, int offset, int length)
          将字节序列从给定缓冲区的子序列写入此通道。
 
从类 java.nio.channels.spi.AbstractSelectableChannel 继承的方法
blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register
 
从类 java.nio.channels.SelectableChannel 继承的方法
register
 
从类 java.nio.channels.spi.AbstractInterruptibleChannel 继承的方法
begin, close, end, isOpen
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
从接口 java.nio.channels.Channel 继承的方法
close, isOpen
 
从接口 java.nio.channels.Channel 继承的方法
close, isOpen
 
从接口 java.nio.channels.Channel 继承的方法
close, isOpen
 
从接口 java.nio.channels.Channel 继承的方法
close, isOpen
 

构造方法详细信息

SocketChannel

protected SocketChannel(SelectorProvider provider)
初始化此类的一个新实例。

方法详细信息

open

public static SocketChannel open()
                          throws IOException
打开套接字通道。

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

返回:
新的套接字通道
抛出:
IOException - 如果发生 I/O 错误

open

public static SocketChannel open(SocketAddress remote)
                          throws IOException
打开套接字通道并将其连接到远程地址。

这种便捷方法的工作方式就像以下过程一样:调用 open() 方法、在得到的套接字通道上调用 connect 方法、向其传递 remote,然后返回该通道。

参数:
remote - 与新通道连接的远程地址
抛出:
AsynchronousCloseException - 如果正在进行连接操作时另一个线程关闭了此通道
ClosedByInterruptException - 如果正在进行连接操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
UnresolvedAddressException - 如果无法完全解析给定的远程地址
UnsupportedAddressTypeException - 如果不支持给定的远程地址类型
SecurityException - 如果已安装安全管理器并且它不允许对给定远程端点进行访问
IOException - 如果发生其他 I/O 错误

validOps

public final int validOps()
返回一个操作集,标识此通道所支持的操作。

套接字通道支持连接、读取和写入,所以此方法返回 (SelectionKey.OP_CONNECT| SelectionKey.OP_READ| SelectionKey.OP_WRITE)

指定者:
SelectableChannel 中的 validOps
返回:
有效操作集

socket

public abstract Socket socket()
检索与此通道关联的套接字。

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

返回:
与此通道关联的套接字

isConnected

public abstract boolean isConnected()
判断是否已连接此通道的网络套接字。

返回:
当且仅当已连接此通道的网络套接字时才返回 true

isConnectionPending

public abstract boolean isConnectionPending()
判断此通道上是否正在进行连接操作。

返回:
当且仅当已在此通道上发起连接操作,但是尚未通过调用 finishConnect 方法完成连接时才返回 true

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 错误