【SocketChannel详解】

SocketChannel

1 定义和特点

selectable channel for stream-oriented connecting sockets.

SocketChannel是一种面向的连接socket套接字的可选择通道

具有以下特点:

  • SocketChannel是用来连接Socket套接字的;

  • SocketChannel主要用途用来处理网络I/O的通道

  • SocketChannel是基于TCP连接传输;

  • SocketChannel实现了可选择通道,可以被多路复用的。

ServerSocketChannel的属性:

参数名作用描述
SO_SNDBUF套接字发送缓冲区大小
SO_RCVBUF套接字接收缓冲区大小
SO_KEEPALIVE保活连接
O_REUSEADDR复用地址
SO_LINGER有数据传输时延缓关闭Channel (只有在非阻塞模式下有用)
TCP_NODELAY禁用Nagle算法

2 使用与相关API

SocketChannel 作为网络 IO 通道,具体负责进行读写操作NIO 把缓冲区的数据写入通道,或者把通道里的数据读到缓冲区

1.创建SocketChannel

//方式1
SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 6666));
//方式2
SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("127.0.0.1", 6666));

方式1是有参构造,构造的同时进行了tcp连接

方式2是无参构造,先创建SocketChannel对象,再tcp连接到服务器。

2.连接校验

// 测试SocketChannel是否为open状态
socketChannel.isOpen();
//测试SocketChannel是否已经被连接    
socketChannel.isConnected();
//测试SocketChannel是否正在进行连接    
socketChannel.isConnectionPending();  
//校验正在进行套接字连接的SocketChannel是否已经完成连接  
socketChannel.finishConnect();    

3.读写模式

SocketChannel支持阻塞和非阻塞两种模式:

socketChannel.configureBlocking(false);

主要是通过以上方法设置SocketChannel的读写模式。false表示非阻塞,true表示阻塞。

4.设置和获取属性

socketChannel.setOption(StandardSocketOptions.SO_KEEPALIVE, Boolean.TRUE)
    .setOption(StandardSocketOptions.TCP_NODELAY, Boolean.TRUE);

通过setOptions方法可以设置socket套接字的相关参数。

socketChannel.getOption(StandardSocketOptions.SO_KEEPALIVE)
socketChannel.getOption(StandardSocketOptions.SO_RCVBUF)

可以通过getOption获取相关参数的值。

  • 使用注意点:

  1. 对于已经存在的socket不能创建SocketChannel

  2. SocketChannel支持两种I/O模式:阻塞式非阻塞式

  3. SocketChannel支持异步关闭。如果SocketChannel在一个线程上read阻塞,另一个线程对该SocketChannel调用shutdownInput,则读阻塞的线程将返回-1表示没有读取任何数据;如果SocketChannel在一个线程上write阻塞,另一个线程对该SocketChannel调用shutdownWrite,则写阻塞的线程将抛出AsynchronousCloseException。

3 SocketChannel和Socket

Socket(套接字)是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象,Socket对象中封装了连接节点的IP地址、端口、协议等信息,是TCP连接的主要API。

socketChannel 套接字通道类(如DatagramChannel、SocketChannel 和ServerSocketChannel)在被实例化时都会创建一个对等 socket 对象(来自 java.net 的类Socket、ServerSocket 和 DatagramSocket),它们已经被更新以识别通道。Socket和Channel之间可以相互得到。

Socket socket = socketChannel.socket();
SocketChannel socketChannel = socket.getChannel();
  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值