事实上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 在网络编程中的应用相关推荐

  1. 网络编程中BIO和NIO的区别

    网络编程中BIO和NIO的区别 先上结论 BIO中,每个请求因为要阻塞直到结果返回,所以比较好的解决是每个请求都需要一个线程来处理,但是线程又是他的制约条件. NIO中,每个请求进来都会绑定到一个ch ...

  2. 网络编程中的关键问题总结

    网络编程中的关键问题总结 总结下网络编程中关键的细节问题,包含连接建立.连接断开.消息到达.发送消息等等: 连接建立 包括服务端接受 (accept) 新连接和客户端成功发起 (connect) 连接 ...

  3. python的功能模块_Python的功能模块[1] - struct - struct 在网络编程中的使用

    struct模块/ struct Module 在网络编程中,利用 socket 进行通信时,常常会用到 struct 模块,在网络通信中,大多数传递的数据以二进制流(binary data)存在.传 ...

  4. 网络编程中的超时检测

    http://blog.163.com/liukang_0404@126/blog/static/55682581201231955735693/ 我们在网络编程中常见的一种做法是:创建好套接字后以阻 ...

  5. 网络编程中使用float型数据要注意

    2019独角兽企业重金招聘Python工程师标准>>> 在网络编程中使用float型数据要特别注意,因为各个机器对浮点数的表示极有可能会不一样,比如在gsoap中,当在客户机和服务器 ...

  6. 实例解析网络编程中的另类内存泄漏

    本文分享自华为云社区<[网络编程开发系列]一种网络编程中的另类内存泄漏>,作者:架构师李肯. 1 写在前面 最近在排查一个网络通讯的压测问题,最后发现跟"内存泄漏"扯上 ...

  7. c++中recvfrom函数_通俗易懂:快速理解网络编程中5种IO模型

    关于IO模型,就必须先谈到几个日常接触的几个与IO相关名字:同步,异步,阻塞,非阻塞. 名词解释 同步 如果事件A需要等待事件B的完成才能完成,这种串行执行机制可以说是同步的,这是一种可靠的任务序列, ...

  8. python网络通信传输的数据类型_Python网络编程中的网络数据和网络错误。

    上一个章节我们说的是套接字名和DNS.这篇文章我们主要解决下面问题. 我们在两台主机之间建立与关闭TCP流连接以及UDP数据报连接后.我们应该怎么准备我们需要传输的数据,该怎么对数据进行编码与格式化. ...

  9. 关于网络编程中MTU、TCP、UDP优化配置的一些总结

    首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层.  其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Data)在 ...

  10. 用java网络编程中的TCP方式上传文本文件及出现的小问题

    自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文 ...

最新文章

  1. Microsoft Visual Studio 2005 简体中文专业版(DVD)下载地址
  2. go build命令详解
  3. python的tell和seek_python文件对象的seek和tell
  4. oracle 导入excel时间格式,将.xls或者.excel格式的数据导入到Oracle中
  5. 微软4年后重登市值第一,纳德拉如何做到的?
  6. Android官方开发文档Training系列课程中文版:分享简单数据之发送简单数据给其它APP
  7. 《你必须知道的.NET》英雄会上骄人亮相
  8. Rainmeter后续——WIN10任务栏透明以及设置开机启动应用
  9. Spring3.0包描述
  10. 网络管理不简单 需化被动为主动
  11. 技术人员如何创业《一》- 产品及想法
  12. android数据分析班,android缓存数据 分析
  13. 详解JS中的事件机制(带实例)
  14. 考研经验贴 and 一些感想
  15. 卫星图像数据下载地址
  16. idea创建yml配置文件不是绿色
  17. 朋友们,想去一线大厂?卷起来...
  18. 为什么手机网速太慢_为什么苹果手机的网速变慢了_苹果手机上网速度慢的解决方法-系统城...
  19. 【Java设计模式 经典设计原则】 八 经典设计原则小结
  20. 积分商城有哪些基本的功能呢?

热门文章

  1. 如何在Marketing Cloud Launchpad里创建新的tile
  2. Marketing Cloud里CSRF token的获取时机
  3. 决定equipment download到CRM后是否执行save的因素
  4. price initialization when clicking new button in WebUI
  5. 我的2018知乎大数据分析
  6. 浅谈SAP Cloud for Sales 自动化
  7. java实现缓存方式_【Java】【器篇】【缓存】一个轻量的缓存实现方式
  8. python列表函数方法_与Python列表相关的函数
  9. 网站打开速度多少毫秒为正常_个人做shopify-怎么测试和优化网站打开速度
  10. python数据表_第1关:了解python数据表操作