文档章节

关于java nio socket的2个小问题的研究

 大胖和二胖
发布于 2016/11/26 15:22
字数 606
阅读 42
收藏 0

第一个问题:

java nio的开发过程当中,在我们一个channel对象的时候,第一步就是要把它的阻塞模式配置为非阻塞。ServerSocketChannel.configureBlocking(false);

我们试图去了解一下这个configureBlocking函数究竟做了些什么事情,

但是最终我们找到了一个native的函数,具体内部干了些什么,貌似不是很容易了解。

那么我们试一下,把它配置为true的话,会发生什么样的事情。

结果,在register到selector上的时候,直接报错了。

java.nio.channels.IllegalBlockingModeException

关于这个问题,虽然没有得到一个确切的答案,不过貌似基本能够解决我们的一部分疑惑,要使用selector就只能是false。

第二个问题,在我之前的文章当中,有一个简单的java nio的例子,当中我们用到了SelectionKey当中3个值,OP_READ、OP_CONNECT、OP_ACCEPT。但是如果我们看一下java源码的话,会发现,其实还有一个值,叫做OP_WRITE,这个值究竟是怎么用的,因为在我们之前例子当中,server和client之间的数据交换已经基本完成,在收到read事件之后,通过channel把响应写回去,貌似没有OP_WRITE什么事啊!!!

首先我们对OP_READ、OP_CONNECT、OP_ACCEPT这几个值,重新进行一下解释,以OP_READ为例,应该解释为read就绪,换句话说,对方,已经向我写入数据了,这个时候开始读了。

那么OP_WRITE就好解释了,写就绪,那么写就绪的条件是什么呢?大体可以有2个条件,自己的写缓冲区是有空间的,网络环境是畅通的。

我们试一下,如果我们把一个SocketChannel的OP_WRITE注册到selector上的话,会发生什么样的事情。

修改一下之前的代码,Server端,接收一个客户端连接之后调用这样一句

channel.register(this.selector, SelectionKey.OP_WRITE);//原来是OP_READ

这样的话,因为网络是畅通的,本地的写缓冲区也是空间很充裕的,会一直试图做写的事情。

综上所述,在网络环境很好,以及写出的任务量不是很大的情况下,可能并不需要OP_WRITE的使用,而在某些高并发的情况下,OP_WRITE可能还是有其实际的用途的。

© 著作权归作者所有

粉丝 23
博文 69
码字总数 50842
作品 0
沈阳
架构师
私信 提问
最近仔细研究了一下Java的NIO以及线程并发,搞清了点思路,特作笔记如下(NIO篇)

[转]http://www.cnblogs.com/feidao/archive/2005/07/15/193788.html 因为前段时间的项目需要写一些高性能服务器,结果写出来的结果是五花八门,我们要求使用NIO编写异步服务器,但是竟然有人...

风林火山
2010/12/26
2.4K
2
smart-ioc 首版发布:为 Android 打造的国产 NIO 通信框架

项目背景 在几年前作者便开始NIO的学习与研究,并在码云上提交了第一个作品smart-socket(NIO版)。本来期望将其打造成异步非阻塞的通信框架,如同netty一样,却最终效果并不理想。恰逢Java ...

三刀蜀黍
2018/05/28
2.8K
13
【转载】一名3年工作经验的程序员应该具备的技能(写得很好,果断转)

因为和同事有约定再加上LZ自己也喜欢做完一件事之后进行总结,因此有了这篇文章。这篇文章大部分内容都是面向整个程序员群体的,当然因为LZ本身是做Java开发的,因此有一部分内容也是专门面向...

jackto原
2018/05/24
1K
3
面试感悟—-一名3年工作经验的程序员应该具备的技能

文章来自:五月的仓颉 五月的仓颉 是一位非常优秀,乐于分享的大神,目前就职阿里 原文链接:https://www.cnblogs.com/xrq730/p/5260294.html 前言 因为和同事有约定再加上 LZ 自己也喜欢做完...

chenssy
2018/08/14
0
0
一名5年工作经验的程序员应该具备的技能

关于程序员的几个阶段 每个程序员、或者说每个工作者都应该有自己的职业规划,如果看到这里的朋友没有自己的职业规划,希望你可以思考一下自己的将来。 LZ常常思考自己的未来,也从自己的思考...

wang123459
2018/04/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java FOR-EACH循环

FOR-EACH循环使得代码更加的简短,也让代码更加易懂,其实他并没有加入什么新的功能。他的功能完全可以用简单的FOR循环代替。 for-each的用法: int a[] = {1,2,3,4,5,6} for(int s:a){ Syst...

无名氏的程序员
10分钟前
2
0
使用HTML5的History API

本文转载于:专业的前端网站➣使用HTML5的History API   HTML5 History API提供了一种功能,能让开发人员在不刷新整个页面的情况下修改站点的URL。这个功能很有用,例如通过一段JavaScript代...

前端老手
13分钟前
2
0
JAVA 编写redisUtils工具类,防止高并发获取缓存出现并发问题

import lombok.extern.slf4j.Slf4j;import org.springframework.data.redis.core.BoundHashOperations;import org.springframework.data.redis.core.BoundValueOperations;import org.......

huangkejie
54分钟前
7
0
JMM内存模型(一)&volatile关键字的可见性

在说这个之前,我想先说一下计算机的内存模型: CPU在执行的时候,肯定要有数据,而数据在内存中放着呢,这里的内存就是计算机的物理内存,刚开始还好,但是随着技术的发展,CPU处理的速度越...

走向人生巅峰的大路
今天
98
0
你对AJAX认知有多少(2)?

接着昨日内容,我们几天继续探讨ajax的相关知识点 提到ajax下面几个问题又是必须要了解的啦~~~ 8、在浏览器端如何得到服务器端响应的XML数据。 通过XMLHttpRequest对象的responseXMl属性 9、 ...

理性思考
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部