创建非阻塞的Socket服务器<四>
今天有一好友问我非阻塞 这一块的东西怎么没有写了。。
其实这两天却是有些浮躁了,看了看设计模式 学习了一些android的知识(毕竟现在
android 是我的工作内容啊)! 然而听到聊友这样的反应从我内心里来说还是很高兴的。
不管怎么说,我只希望我写的这些东西能够给他人一点提示,只要他人能够用得到就好,我就
是一个菜鸟,只不过是吧自己的理解记录一下,希望能通其他人共勉!
----------------------------------
承接 前几篇的内容。。。从前几篇的内容来看都是 细细的说了一下 NIO 包个个类的一些重要方法和属性,当然其实NIO包下并非只有这几个类!那么接下来我们就把这些 例子 综合一下 做一个小小的 实例!
做实例之前我要声明一点,接下来做的实例是我从孙卫琴,孙大姐的书籍中摘抄的,但是前面的理解 都是我个人的思想! 希望大家能明白这一点!
首先我们创建服务端目的在于 使用一个线程来处理三件事情,这样我们就打打提高了线程的
工作效率。
public class Server{private Selector selector;private ServerSocketChannel serverSocketChannel;private int port = 8000;private Charset charset = Charset.forName("UTF-8"); public Server(){ selector = Selector.open();//这是一个静态方法创建一个 Selector serverSocketChannel = ServerSocketChannel.open(); //这个地方一定要设置的 前面已经提到了 默认的是阻塞模式的 serverSocketChannel.configureBlocking(false); //绑定端口 serverSocketChannel.socket.bind(new InetSocketAddress(port)); } public mainService(){ //你可能会有疑问这个地方注册时候 是不是要注册三个 //SelectionKey.OP_ACCEPT 但是 请记住 serverSocketChannel 就只能 // 关注一个 连接接受时间 serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT); while(selector.select()>0){ Set selectKey = selector.selectedKeys(); Iterator it = selectKey.iterator(); while(it.hasNext()){ //这里我们要拿到 key 包含了socket所希望的任何事件 SelectionKey key = (SelectionKey )it.next(); it.remove(); if(key.isAcceptable()){ ServerSocketChannel ssc = (ServerSocketChannel)key.getChannel(); SocketChannel socketChannel = (SocketChannel)ssc.accept(); socketChannel.configureBlocking(false); ByteBuffer buffer = ByteBUffer.allocate(1024); socketCHannel.register(selector,SelectionKey.OP__READ | SelectionKey.OP_WRITE,buffer); }else if(key.isWriteable()){ writeService(key); }else if(key.isReadable()){ readService(key); } } } }}这里服务端就先到这里。。接下来会是客户端!
详细的东西 我会