Java NIO学习笔记六 SocketChannel 和 ServerSocketChannel
Java NIO SocketChannel
Java NIO SocketChannel是连接到TCP网络socket(套接字)的通道。Java NIO相当于Java Networking的socket(套接字)。有两种创建SocketChannel的方法:
- 打开
SocketChannel并连接到互联网上的某个服务器。 - 当一个连接接入到一个
ServerSocketChannel时,SocketChannel就会被创建。
打开一个SocketChannel
打开一个SocketChannel:
SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress(“http://jenkov.com”,80));
关闭SocketChannel
使用完SocketChannel后,可以通过调用SocketChannel的close()方法,将其关闭。
代码展示:
socketChannel.close();
从SocketChannel读取数据
要从SocketChannel您那里读取数据,可以调用read()方法。
代码:
ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = socketChannel.read(buf);
首先:进行Buffer分配,从SocketChannel中读取的数据到Buffer中。
然后:调用SocketChannel的read()方法。将数据从SocketChannel中读入Buffer。返回值是int,表示有多少字节数据被读入到Buffer缓存中。如果返回-1,则到达端到端(连接已关闭)。
数据写入SocketChannel
SocketChannel使用SocketChannel的write() 方法来写入数据,该方法使用Buffer做参数。
代码展示:
String newData =“要写入文件的新字符串...”+ System.currentTimeMillis(); ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes()); buf.flip(); while(buf.hasRemaining()){
channel.write(buf);
}
注意SocketChannel.write()在while循环中如何调用该方法。不能保证write()方法写入SocketChannel的字节数。因此,我们重复调用write(),直到Buffer没有字节可以写入。
非阻塞模式
您可以将SocketChannel设置为非阻塞模式。在非阻塞模式下,你可以以异步方式调用connect(),read()并write()方法。
connect()
如果SocketChannel是非阻塞模式,并且您调用connect(),方法可能会在建立连接之前返回。要确定连接是否建立,可以调用finishConnect()方法,如下所示:
socketChannel.configureBlocking(假);
socketChannel.connect(new InetSocketAddress(“http://jenkov.com”,80)); while(!socketChannel.finishConnect()){
//做其他的事情
}
write()
在非阻塞模式下,write()方法在不写任何数据的情况下可以返回。因此,你需要在循环中调用write()方法。代码同上。
read()
在非阻塞模式下,read()方法可以在没有读取任何数据的情况下返回。因此,您需要注意返回的值int,这表示读取了多少个字节。
具有选择器的非阻塞模式
这种非阻塞模式的SocketChannel效果要比Selector好点。通过使用Selector注册一个或一个以上SocketChannel,你可以访问已经准备读、写通道的Selector。
Java NIO ServerSocketChannel
Java NIO ServerSocketChannel是可以监听接入TCP连接的通道,就像ServerSocket的Java标准网络一样。ServerSocketChannel类位于java.nio.channels包中。
java代码展示:
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(9999));
while(true){
SocketChannel socketChannel =
serverSocketChannel.accept();
//用socketChannel做一些事情...
}
开启ServerSocketChannel
通过调用ServerSocketChannel的open() 方法,你可以打开一个ServerSocketChannel。
代码展示:
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
关闭ServerSocketChannel
通过调用ServerSocketChannel的close() 方法来关闭ServerSocketChannel。这是怎么样的样子:
serverSocketChannel.close();
监听接入的连接
通过调用ServerSocketChannel的accept() 方法来监听传接入连接。当该accept()方法返回时,它返回SocketChannel一个传入连接。因此,accept()方法阻塞直到有连接介入。
我们通常不会对单个连接进行监听,所以您可以在accept()内部调用一个循环,来监听多个接入的连接。
代码展示:
while(true){
SocketChannel socketChannel = serverSocketChannel.accept();
//用socketChannel做一些事情...
}
非阻塞模式
ServerSocketChannel可以设置为非阻塞模式。在非阻塞模式下,accept()方法立即返回,如果没有连接,则返回null。因此,您必须检查返回值 SocketChannel是否为空。
代码展示:
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.socket()。bind(new InetSocketAddress(9999));
serverSocketChannel.configureBlocking(false); while(true){
SocketChannel socketChannel =
serverSocketChannel.accept(); if(socketChannel!= null){
//用socketChannel做一些事情...
}
}
Java NIO学习笔记六 SocketChannel 和 ServerSocketChannel的更多相关文章
- Java IO学习笔记六:NIO到多路复用
作者:Grey 原文地址:Java IO学习笔记六:NIO到多路复用 虽然NIO性能上比BIO要好,参考:Java IO学习笔记五:BIO到NIO 但是NIO也有问题,NIO服务端的示例代码中往往会包 ...
- Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习笔记(四)----文件通道和网络通道
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习笔记(三)----Selector
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习笔记(一)----概述,Channel/Buffer
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO学习笔记
Java NIO学习笔记 一 基本概念 IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成. 所有语言运行时系统提供执 ...
- Java NIO 学习笔记(二)----聚集和分散,通道到通道
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习笔记(七)----NIO/IO 的对比和总结
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
随机推荐
- ie8兼容background-size属性
满心欢喜地写代码,最后测试兼容性的时候发现Logo图片在IE8下特别大.明显是background-size在ie8一下不兼容. 我懂得,IE8还是个孩子,我就加几句你独有的代码让你兼容吧,司空见惯了 ...
- bootstrap+masonry.js写瀑布流
最近在用bootstrap写一个网站,其中有个图文展示的页面要用到瀑布流的效果.因为项目要求,项目要以bootstrap为基准,不准私自添加内联样式.内部样式,所以,自己写瀑布流就不行了,所以,根据要 ...
- arcgis属性选取like用法
查询对象为ArcInfo coverage,shapefile, INFO table,dBASE table,ArcSDE data,ArcIMS 要素类,或者 ArcIMS image servi ...
- JavaScript面向对象编程—this详解
this详解 作者的话 在JavaScriptOPPt面向对象编程中,this这位老大哥,相信大家不会陌生.大家在遇到this时,很多朋友难免会有个疑问:"这个this是什么,它到底指向 ...
- 浅析SQL Server数据库中的伪列以及伪列的含义
SQL Server中的伪列 下午看QQ群有人在讨论(非聚集)索引的存储,说,对于聚集索引表,非聚集索引存储的是索引键值+聚集索引键值:对于非聚集索引表,索引存储的是索引键值+RowId,这应该是一个 ...
- CSS3特效----图片动态提示效果
需掌握的知识点: 1.掌握两个HTML5新标签figure以及figcaption的用法 2.掌握transform的属性特点,并能熟练运用 3.学会通过transition及transform配合, ...
- 导入csv文件到数据库
csv:逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本).纯文本意味着该文件是一个字符 ...
- python小工具:用python操作HP的Quality Center
背景是这样的:这个组的测试人员每跑一个case都要上传测试结果附件到QC.每个待测功能模块可能包含几十上百的case.于是手工上传测试结果变成了繁重的体力劳动.令人惊讶的是我们的工具开发组竟然说做不了 ...
- 【JAVAWEB学习笔记】12_Http&Tomcat
一.Http协议 1.什么是Http协议 HTTP,超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的 一种网络协议.所有的WWW文件都必须遵守这 ...
- Java Regex match IP address
Reference: [1] https://www.mkyong.com/regular-expressions/how-to-validate-ip-address-with-regular-ex ...