SocketChannel简述

摘要:
前言在前面的Channel概述的分类中提到过SocketChannel主要是用来基于TCP通信的通道。false表示非阻塞,true表示阻塞。读写都是面向缓冲区,这个读写方式与前文中的FileChannel一样,这里不再赘述。socketChannel.getOptionsocketChannel.getOption可以通过getOption获取相关参数的值。前面提到SocketChannel还支持多路复用,但是多路复用在后续章节中会介绍到,故此将SocketChannel注册到通道上,多路复用的使用,在接下来文章中会介绍。
前言

在前面的Channel概述的分类中提到过SocketChannel主要是用来基于TCP通信的通道。这篇文章详细介绍下SocketChannel

  • SocketChannel是什么
  • SocketChannel特点
  • SocketChannel的使用
SocketChannel

A selectable channel for stream-oriented connecting sockets.

以上是Java docs中对于SocketChannel的描述:SocketChannel是一种面向流连接只sockets套接字的可选择通道。从这里可以看出:

  • SocketChannel是用来连接Socket套接字
  • SocketChannel主要用途用来处理网络I/O的通道
  • SocketChannel是基于TCP连接传输
  • SocketChannel实现了可选择通道,可以被多路复用的
SocketChannel特点

SocketChannel具有以下的特征:

  1. 对于已经存在的socket不能创建SocketChannel
  2. SocketChannel中提供的open接口创建的Channel并没有进行网络级联,需要使用connect接口连接到指定地址
  3. 未进行连接的SocketChannle执行I/O操作时,会抛出NotYetConnectedException
  4. SocketChannel支持两种I/O模式:阻塞式和非阻塞式
  5. SocketChannel支持异步关闭。如果SocketChannel在一个线程上read阻塞,另一个线程对该SocketChannel调用shutdownInput,则读阻塞的线程将返回-1表示没有读取任何数据;如果SocketChannel在一个线程上write阻塞,另一个线程对该SocketChannel调用shutdownWrite,则写阻塞的线程将抛出AsynchronousCloseException
  6. SocketChannel支持设定参数
参数名作用描述
SO_SNDBUF套接字发送缓冲区大小
SO_RCVBUF套接字接收缓冲区大小
SO_KEEPALIVE保活连接
O_REUSEADDR复用地址
SO_LINGER有数据传输时延缓关闭Channel (只有在非阻塞模式下有用)
TCP_NODELAY禁用Nagle算法
SocketChannel的使用

1.创建SocketChannel

方式1.
SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("www.baidu.com", 80));

方式2. 
SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("www.baidu.com", 80));

直接使用有参open api或者使用无参open api,但是在无参open只是创建了一个SocketChannel对象,并没有进行实质的tcp连接。

2.连接校验

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

3.读写模式

前面提到SocketChannel支持阻塞和非阻塞两种模式:

socketChannel.configureBlocking(false);

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

4.读写

SocketChannel socketChannel = SocketChannel.open(
new InetSocketAddress("www.baidu.com", 80));
ByteBuffer byteBuffer = ByteBuffer.allocate(16);
socketChannel.read(byteBuffer);
socketChannel.close();
System.out.println("test end!");

以上为阻塞式读,当执行到read出,线程将阻塞,控制台将无法打印test end!。

SocketChannel socketChannel = SocketChannel.open(
new InetSocketAddress("www.baidu.com", 80));
socketChannel.configureBlocking(false);
ByteBuffer byteBuffer = ByteBuffer.allocate(16);
socketChannel.read(byteBuffer);
socketChannel.close();
System.out.println("test end!");

以上为非阻塞读,控制台将打印test end!。

读写都是面向缓冲区,这个读写方式与前文中的FileChannel一样,这里不再赘述。

5.设置和获取参数

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获取相关参数的值。如默认的接收缓冲区大小是8192byte。

前面提到SocketChannel还支持多路复用,但是多路复用在后续章节中会介绍到,故此将SocketChannel注册到通道上,多路复用的使用,在接下来文章中会介绍。

免责声明:文章转载自《SocketChannel简述》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇《放弃繁琐的if-else》开启Assert断言的新时代【学习总结】《大话数据结构》- 第6章-树下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

钩子(Hook)专题

基本概念 运行机制 钩子类型 作者 基本概念 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。 钩子实际上是一个处理消息的程序...

python线程互斥锁Lock(29)

在前一篇文章python线程创建和传参中我们介绍了关于python线程的一些简单函数使用和线程的参数传递,使用多线程可以同时执行多个任务,提高开发效率,但是在实际开发中往往我们会碰到线程同步问题,假如有这样一个场景:对全局变量累加1000000次,为了提高效率,我们可以使用多线程完成,示例代码如下: #!usr/bin/env python#-*- cod...

生产者和消费者模型

生产者和消费者模型 线程通信:不同的线程执行不同的任务,如果这些任务有某种关系,各个线程必须要能够通信,从而完成工作。线程通信中的经典问题:生产者和消费者问题 模型: 这个模型也体现了面向对象的设计理念:低耦合 也就是为什么生产者生产的东西为什么不直接给消费者,还有经过一个缓冲区(共享资源区) 这就相当于去包子店吃包子,你要5个包子,老板把5个人包子放在...

Java常考面试题

Java常考面试题,整理自牛客网和程序员面试宝典,有的题不太好。 1. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 答:Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自...

C/S系统实现两数求和(非阻塞+epoll+心跳包检测用户在线状况+滚动日志+配置文件.)

C/S系统实现两数求和 任务要求: 实现配置文件 实现日志滚动 设置非阻塞套接字,EPOLL实现 检测客户端的连接,设置心跳检测 主线程 + 心跳检测线程 + EPOLL的ET模式处理事务线程 注意事项:设置volatile类型跳出死循环 作品简介: 本次实验分为bin,config,include,log,src五个文件夹以及一个makefile...

Javascript:再论Javascript的单线程机制 之 DOM渲染时机

Javascript:再论Javascript的单线程机制 之 DOM渲染时机 背景 Javascript是单线程事件驱动的,所有能看到的Javascript代码都是在一个线程执行,定时器回调和AJAX回调会在适当的时刻插入队列等待Javascript线程调度执行,今天想测试一下DOM渲染的线程与时机,具体的问题是: 修改DOM会立即显示在UI中吗? 一个...