`

【Java NIO 简例】SocketChannel

    博客分类:
  • Java
nio 
阅读更多

原文:《Java NIO SocketChannel

Java NIO 中的 SocketChannel 用于处理 TCP 网络连接。

 

开启 SocketChannel

示例:连接远程服务器

SocketChannel channel = SocketChannel.open();
channel.connect(new InetSocketAddress("abc.xyz", 80));

ServerSocketChannel.accept() 方法也会返回SocketChannel实例。那属于服务端的操作,将在ServerSocketChannel 中说明。

 

关闭 SocketChannel

可直接调用 SocketChannel.close() 方法关闭,也可以 try-with-resources 的方式关闭。

channel.close();

 

读取 SocketChannel 中的数据

可调用 SocketChannel 的 read(ByteBuffer) 方法将数据从channel的当前位置开始,读取到buffer中。

如果返回值为 -1,则表示已读到数据流末尾。

ByteBuffer buffer = ByteBuffer.allocate(1024);
int readByteCount = channel.read(buffer);

 

其它方法:read(ByteBuffer[]) 和 read(ByteBuffer[], int, int) 属于 ScatteringByteChannel 的 数据分散 特性。

 

向 SocketChannel 写数据

可调用 SocketChannel 的 write(ByteBuffer) 方法,将 buffer 当前位置 开始的数据写入 channel。

返回值表示本次写入channel的字节数,可能为0。所以需要放在while循环中,确保buffer中所有数据都被写入channel。

// byte[] data = ...
ByteBuffer buffer = ByteBuffer.allocate(data.length);
buffer.put(data);
buffer.flip();
while (buffer.hasRemaining()) {
  channel.write(buffer);
}

 

其它方法:write(ByteBuffer[]) 和 write(ByteBuffer[], int, int) 属于 GatheringByteChannel 的 数据聚集 特性。

 

非阻塞模式

在非阻塞模式下,SocketChannel 的 connect()、write()、read() 方法都会以异步的模式工作。
即:

  • connect() 方法返回时,连接可能尚未建立;
  • write() 方法返回时,数据可能未写入 channel(其实阻塞模式下也可能未写完);
  • read() 方法返回时,可能未读到数据。

所以需要通过 SocketChannel.finishConnect() 方法判断是否已建立连接;判断 read() 返回的值是否大于0

channel.configureBlocking(false); // 将channel设置为 非阻塞模式
channel.connect(new InetSocketAddress("abc.xyz", 80));

// 等待连接
while (!channel.finishConnect()) {
  // 连接尚未建立,可以做其它事
}

// 连接已建立

 

此外,非阻塞模式的 SocketChannel 更适合与 Selector 搭配使用

分享到:
评论

相关推荐

    JavaNIO chm帮助文档

    Java NIO系列教程(八) SocketChannel Java NIO系列教程(九) ServerSocketChannel Java NIO系列教程(十) Java NIO DatagramChannel Java NIO系列教程(十一) Pipe Java NIO系列教程(十二) Java NIO与IO

    java NIO和java并发编程的书籍

    java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...

    java nio 包读取超大数据文件

    Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据...

    Java NIO英文高清原版

    Java NIO英文高清原版

    java NIO 中文版

    讲解了 JavaIO 与 JAVA NIO区别,JAVA NIO设计理念,以及JDK中java NIO中语法的使用

    java NIO 视频教程

    Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...

    Java NIO 中文 Java NIO 中文 Java NIO 中文文档

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...

    java nio 实现socket

    java nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socket

    Java NIO实战开发多人聊天室

    09-Java NIO-Channel-SocketChannel.mp4 10-Java NIO-Channel-DatagramChannel.mp4 11-Java NIO-Channel-分散和聚集.mp4 12-Java NIO-Buffer-概述.mp4 13-Java NIO-Buffer-基本使用.mp4 14-Java NIO-Buffer-三个属性...

    java nio中文版

    java NIO是 java New IO 的简称,在 jdk1.4 里提供的新 api 。 Sun 官方标榜的特性如下: – 为所有的原始类型提供 (Buffer) 缓存支持。 – 字符集编码解码解决方案。 – Channel :一个新的原始 I/O 抽象。 – 支持...

    基于Java NIO实现五子棋游戏.zip

    基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现...

    【Java NIO 简例】分散(Scatter) – 聚集(Gather)

    原文:《Java NIO Scatter / Gather》 Scatter(分散):将一个 Channel 中的数据读取到多个 Buffer 中。 Gather(聚集):将多个 Buffer 中的数据写入一个 Channel 中。 Scatter/Gather 机制可以方便处理多个分开的...

    Java Nio selector例程

    java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...

    java NIO技巧及原理

    java NIO技巧及原理解析,java IO原理,NIO框架分析,性能比较

    java NIO.zip

    java NIO.zip

    java基于NIO实现Reactor模型源码.zip

    java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现...

    java多路复用socket客户端.

    Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel并连接到互联网上的某台服务器。 一个新连接到达ServerSocketChannel时,会创建一个...

    java nio 读文件

    java nio 读文件,java nio 读文件

    JAVA NIO 学习资料

    JAVA NIO学习资料JAVA NIO学习资料

    java nio入门学习,两个pdf

    java nio入门学习,两个pdfjava nio入门学习,两个pdf

Global site tag (gtag.js) - Google Analytics