SocketChannel(示例,出错代码)

本文详细介绍了SocketChannel类,它是Java NIO中的一个重要组件,用于处理面向流的连接套接字。文章解释了如何创建、连接及操作SocketChannel,包括其非阻塞特性、并发使用方式以及与Socket对象的关系。

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。

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

从以下版本开始:
1.4
构造方法摘要
protected SocketChannel(SelectorProvider provider)
初始化此类的一个新实例。

方法摘要
abstract boolean connect(SocketAddress remote)
连接此通道的套接字。

abstract boolean finishConnect()
完成套接字通道的连接过程。

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 Socket socket()
获取与此通道关联的套接字。

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

abstract int write(ByteBuffer src)
将字节序列从给定的缓冲区中写入此通道。

long write(ByteBuffer[] srcs)
将字节序列从给定的缓冲区写入此通道。

abstract long write(ByteBuffer[] srcs, int offset, int length)
将字节序列从给定缓冲区的子序列写入此通道。

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值