Java NIO服务器端开发
2016-07-10 14:14
381 查看
一、NIO类库简介
1、缓冲区Buffer
Buffer是一个对象,包含一些要写入和读出的数据。在NIO中,所有的数据都是用缓冲区处理的,读取数据时,它是从通道(Channel)直接读到缓冲区中,在写入数据时,也是从缓冲区写入到通道。
缓冲区实质上是一个数组,通常是一个字节数组(ByteBuffer),也可以是其它类型的数组,此外缓冲区还提供了对数据的结构化访问以及维护读写位置等信息。
Buffer类的继承关系如下图所示:
import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.util.Iterator; import java.util.Set; public class ServerSocketChannelDemo { public static void main(String[] args) { ServerSocketChannel serverSocketChannel; Selector selector=null; try { serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.configureBlocking(false); serverSocketChannel.socket().bind(new InetSocketAddress(8080)); selector=Selector.open(); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } while(true) { try { //select()阻塞到至少有一个通道在你注册的事件上就绪了 //如果没有准备好的channel,就在这一直阻塞 //select(long timeout)和select()一样,除了最长会阻塞timeout毫秒(参数)。 selector.select(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); break; } //返回已经就绪的SelectionKey,然后迭代执行 Set<SelectionKey> readKeys=selector.selectedKeys(); for(Iterator<SelectionKey> it=readKeys.iterator();it.hasNext();) { SelectionKey key=it.next(); it.remove(); try { if(key.isAcceptable()) { ServerSocketChannel server=(ServerSocketChannel) key.channel(); SocketChannel client=server.accept(); client.configureBlocking(false); client.register(selector,SelectionKey.OP_WRITE); } else if(key.isWritable()) { SocketChannel client=(SocketChannel) key.channel(); ByteBuffer buffer=ByteBuffer.allocate(20); String str="hello"; buffer=ByteBuffer.wrap(str.getBytes()); client.write(buffer); key.cancel(); } }catch(IOException e) { e.printStackTrace(); key.cancel(); try { key.channel().close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } } } }
View Code
我们用telnet localhost 8080模拟出多个客户端:
程序运行结果如下:
三、参考资料
1、netty权威指南(李林峰)相关文章推荐
- [Java IO]01_File类和RandomAccessFile类
- Java异常
- SpringSecurity方法层4种方式使用
- Lucene建立索引 使用IKAnalyzer扩展词库
- 如何用javadoc命令,生成api帮助文档
- IKAnalyzer词典占用内存大小分析
- java编译做了哪些事?
- java web
- des算法java模拟实现
- druid-1.0.21源代码导入eclipse工程遇到的问题
- java web
- 配置hadoop-1.2.1出现localhost: Error: JAVA_HOME is not set.
- 日常小结-java随机数类Random
- JavaSE 之 final 初探
- 二、java三大特性--继承
- java+内存分配及变量存储位置的区别[转]
- java异常情况分析
- springMVC初体验
- java单元测试junit
- Java XML解析之SAX解析