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 ...
随机推荐
- EasyUI开发的驾校管理系统
开源SmartLife驾校管理系统,地址:https://github.com/SmartOfLife/DriveMgr 1.界面布局是用的ymnets大神的界面,具体参考:http://www.cn ...
- 基于django做HTTP代理服务器
计算机网络的一次小实验,最后一共用了不到100行 实现了: a) 网站过滤:允许/不允许访问某些网站: b) 用户过滤:支持/不支持某些用户访问外部网站: c) 网站引导:将用户对某个网站的访问引导至 ...
- Vue2.0的变化 ,组件模板,生命周期,循环,自定义键盘指令,过滤器
组件模板: 之前: <template> <h3>我是组件</h3><strong>我是加粗标签</strong> </templat ...
- Oracle与mysql的字段类型整理
Oralce的字段类型整理如下: Mysql的字段类型整理如下: 最后面一栏是对应JAVA的基本类型.希望对初学者有用,初学者在学习JAVA的时候,不知道怎么把JAVA的对象指向到ORALCE或者MY ...
- 单页应用跳转ui-view,$stateProvider,$urlRouterProvider
<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta charset="UTF- ...
- Struts2之2.5.10.1HelloWorld
Struts2.5.10.1是目前为止最新的版本,struts2建议持续跟进,理由大家都懂.好了,下面步入正题. 基于struts2.5.10.1建立一个HelloWorld,基于注解的哈! 工具:e ...
- gitlab 取消注册功能
gitlab 默认安装完成以后是允许用户注册,公司内部使用所以准备禁用了注册功能,只允许管理员从后台开通权限: 1.进入"Admin Area" 2.在左边菜单栏最低下点击&quo ...
- POJ2524并查集水题
Description There are so many different religions in the world today that it is difficult to keep tr ...
- 使用windows桌面ftp上传文件到linux服务器
首先在linux服务器上安装ftp [root@host2 test]#yum -y install ftp vsftpd [root@host2 test]#service vsftpd start ...
- Day1-模块初识
模块,也叫库,分为标准库和第三方库.标准库,直接导入使用,比如import getpass:第三方库,需下载安装才能使用,比如paramiko: 一.sys模块 import sys print(sy ...