标题:
IO的阻塞与非阻塞、同步与异步以及Java网络IO交互方式(7)
[打印本页]
作者:
yuyang911220
时间:
2015-11-21 16:55
标题:
IO的阻塞与非阻塞、同步与异步以及Java网络IO交互方式(7)
下面是简单的实现:
[url=]
[/url]
public
class
NioNonBlockingSelectorTest{ Selector selector;
private
ByteBuffer receivebuffer = ByteBuffer.allocate(1024
); @Test
public
void
testNioNonBlockingSelector()
throws
Exception { selector
=
Selector.open(); SocketAddress address
=
new
InetSocketAddress(10002
); ServerSocketChannel channel
=
ServerSocketChannel.open(); channel.socket().bind(address); channel.configureBlocking(
false
); channel.register(selector, SelectionKey.OP_ACCEPT);
while
(
true
) { selector.select(); Iterator
<SelectionKey> iterator =
selector.selectedKeys().iterator();
while
(iterator.hasNext()) { SelectionKey selectionKey
=
iterator.next(); iterator.remove(); handleKey(selectionKey); } } }
private
void
handleKey(SelectionKey selectionKey)
throws
IOException { ServerSocketChannel server
=
null
; SocketChannel client
=
null
;
if
(selectionKey.isAcceptable()) { server
=
(ServerSocketChannel)selectionKey.channel(); client
=
server.accept(); System.out.println(
"客户端: " +
client.socket().getRemoteSocketAddress().toString()); client.configureBlocking(
false
); client.register(selector, SelectionKey.OP_READ); }
if
(selectionKey.isReadable()) { client
=
(SocketChannel)selectionKey.channel(); receivebuffer.clear();
int
count =
client.read(receivebuffer);
if
(count > 0
) { String receiveText
=
new
String( receivebuffer.array(),0
,count); System.out.println(
"服务器端接受客户端数据--:" +
receiveText); client.register(selector, SelectionKey.OP_READ); } } } }
[url=]
[/url]
Java NIO提供的非阻塞IO并不是单纯的非阻塞IO模式,而是建立在Reactor模式上的IO复用模型;
在IO multiplexing Model中,对于每一个socket,一般都设置成为non-blocking,但是整个用户进程其实是一直被阻塞的。只不过进程是被select这个函数阻塞,而不是被socket IO给阻塞,所以还是属于非阻塞的IO。
这篇文章
中把这种模式归为了异步阻塞,我其实是认为这是同步非阻塞的,可能看的角度不一样。
异步IO
Java1.7中提供了异步IO的支持,暂时还没有看过,所以以后再讨论。
网络IO优化
对于网络IO有一些基本的处理规则如下:
1。减少交互的次数。比如增加缓存,合并请求。
2。减少传输数据大小。比如压缩后传输、约定合理的数据协议。
3。减少编码。比如提前将字符转化为字节再传输。
4。根据应用场景选择合适的交互方式,同步阻塞,同步非阻塞,异步阻塞,异步非阻塞。
就说到这里吧,感觉有点乱,有些地方还是找不到更贴切的语言来描述。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0