nio的应用 java_Java NIO 在网络编程中的应用
事实上Java nio引入了异步机制,异步I/O 在Linux上有 select poll epoll,支持多路复用。在Java里就是通过nio的一整套类来实现的,主要有:
ByteBuffer
SocketChannel
ServerSocketChannel
Selector
SelectionKey
注册:
channel调用 register来向selector注册,
移除:
SelectionKey.cancel //仅仅把selectionkey 对应的channel从selector中移除,socket仍然处于活动状态,需要手动关闭。
channel.close()//从selector移除,加关闭channel关联的socket对象
//得到一个selector
Selector select = Selector.open();
ServerSocketChannel ss = ServerSocketChannel.open();
//必须配置成non-blocking
ss.configureBlocking(false);
//绑定到一个地址
ss.socket().bind( new InetSocketAddress("0.0.0.0", 5858));
//把channel注册selector,此时会有一个SelectionKey跟这个channel关联
//当有连接进来时,select可以返回selectedKeys
ss.register(select, SelectionKey.OP_ACCEPT);
while(select.select() >= 0){
//返回处于就绪状态的keys
Set keyReady = select.selectedKeys();
//轮询每一个就绪状态的key,通过key可以得到channel,也可以通过key从selector里删除
for( Iterator iter = keyReady.iterator(); iter.hasNext(); ){
SelectionKey sk = iter.next();
iter.remove();
System.out.println("cancel" + select.keys().size());
SocketChannel client = null;
if ( sk.channel() instanceof ServerSocketChannel){
ss= (ServerSocketChannel)sk.channel();
client = ss.accept();
System.out.println("accept: " + client.socket());
//client.socket().close();
//必须配置成non-blocking
client.configureBlocking(false);
//把非被动socket注册到selector
client.register(select, SelectionKey.OP_READ);
}
else if (sk.channel() instanceof SocketChannel ){
SocketChannel ch = (SocketChannel)sk.channel();
ByteBuffer recvBuf = ByteBuffer.allocate(100);
//必须用nio中的ByteBuffer,否则会出错
int len = ch.read(recvBuf);
if ( len < 0){
//移除前必须关闭socket,否则会有很多socket处于打开状态
ch.socket().close();
//从selector移除channel
sk.cancel();
continue;
}
recvBuf.flip();
ch.write(recvBuf);
//sk.cancel();
System.out.println("cancel" + select.keys().size() + "len " + len);
len = ch.read(recvBuf);
//关闭channel,此时会关闭channel对应的socket,同时从selector中移除这个channel
// ch.close();
System.out.println("len" + len);
}
else{
System.out.println("error change");
}
}
}
System.out.println("end======");
nio的应用 java_Java NIO 在网络编程中的应用相关推荐
- 网络编程中BIO和NIO的区别
网络编程中BIO和NIO的区别 先上结论 BIO中,每个请求因为要阻塞直到结果返回,所以比较好的解决是每个请求都需要一个线程来处理,但是线程又是他的制约条件. NIO中,每个请求进来都会绑定到一个ch ...
- 网络编程中的关键问题总结
网络编程中的关键问题总结 总结下网络编程中关键的细节问题,包含连接建立.连接断开.消息到达.发送消息等等: 连接建立 包括服务端接受 (accept) 新连接和客户端成功发起 (connect) 连接 ...
- python的功能模块_Python的功能模块[1] - struct - struct 在网络编程中的使用
struct模块/ struct Module 在网络编程中,利用 socket 进行通信时,常常会用到 struct 模块,在网络通信中,大多数传递的数据以二进制流(binary data)存在.传 ...
- 网络编程中的超时检测
http://blog.163.com/liukang_0404@126/blog/static/55682581201231955735693/ 我们在网络编程中常见的一种做法是:创建好套接字后以阻 ...
- 网络编程中使用float型数据要注意
2019独角兽企业重金招聘Python工程师标准>>> 在网络编程中使用float型数据要特别注意,因为各个机器对浮点数的表示极有可能会不一样,比如在gsoap中,当在客户机和服务器 ...
- 实例解析网络编程中的另类内存泄漏
本文分享自华为云社区<[网络编程开发系列]一种网络编程中的另类内存泄漏>,作者:架构师李肯. 1 写在前面 最近在排查一个网络通讯的压测问题,最后发现跟"内存泄漏"扯上 ...
- c++中recvfrom函数_通俗易懂:快速理解网络编程中5种IO模型
关于IO模型,就必须先谈到几个日常接触的几个与IO相关名字:同步,异步,阻塞,非阻塞. 名词解释 同步 如果事件A需要等待事件B的完成才能完成,这种串行执行机制可以说是同步的,这是一种可靠的任务序列, ...
- python网络通信传输的数据类型_Python网络编程中的网络数据和网络错误。
上一个章节我们说的是套接字名和DNS.这篇文章我们主要解决下面问题. 我们在两台主机之间建立与关闭TCP流连接以及UDP数据报连接后.我们应该怎么准备我们需要传输的数据,该怎么对数据进行编码与格式化. ...
- 关于网络编程中MTU、TCP、UDP优化配置的一些总结
首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Data)在 ...
- 用java网络编程中的TCP方式上传文本文件及出现的小问题
自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文 ...
最新文章
- Microsoft Visual Studio 2005 简体中文专业版(DVD)下载地址
- go build命令详解
- python的tell和seek_python文件对象的seek和tell
- oracle 导入excel时间格式,将.xls或者.excel格式的数据导入到Oracle中
- 微软4年后重登市值第一,纳德拉如何做到的?
- Android官方开发文档Training系列课程中文版:分享简单数据之发送简单数据给其它APP
- 《你必须知道的.NET》英雄会上骄人亮相
- Rainmeter后续——WIN10任务栏透明以及设置开机启动应用
- Spring3.0包描述
- 网络管理不简单 需化被动为主动
- 技术人员如何创业《一》- 产品及想法
- android数据分析班,android缓存数据 分析
- 详解JS中的事件机制(带实例)
- 考研经验贴 and 一些感想
- 卫星图像数据下载地址
- idea创建yml配置文件不是绿色
- 朋友们,想去一线大厂?卷起来...
- 为什么手机网速太慢_为什么苹果手机的网速变慢了_苹果手机上网速度慢的解决方法-系统城...
- 【Java设计模式 经典设计原则】 八 经典设计原则小结
- 积分商城有哪些基本的功能呢?
热门文章
- 如何在Marketing Cloud Launchpad里创建新的tile
- Marketing Cloud里CSRF token的获取时机
- 决定equipment download到CRM后是否执行save的因素
- price initialization when clicking new button in WebUI
- 我的2018知乎大数据分析
- 浅谈SAP Cloud for Sales 自动化
- java实现缓存方式_【Java】【器篇】【缓存】一个轻量的缓存实现方式
- python列表函数方法_与Python列表相关的函数
- 网站打开速度多少毫秒为正常_个人做shopify-怎么测试和优化网站打开速度
- python数据表_第1关:了解python数据表操作