java socket nio编程
2016-05-15 23:49
519 查看
上次写了一个socket的基本编程,但是有个问题,阻塞特别严重,于是小编便去找了nio学习了一下...
代码不想解释太多,有空整理一下nio的基本概念...
public class TimeServer { public static void main(String[] args) { MultipexerTimeServer timersServer=new MultipexerTimeServer("192.168.1.102", 8400); new Thread(timersServer, "nio-多路复用器").start(); } }
public class MultipexerTimeServer implements Runnable { private Selector selector; private ServerSocketChannel serverSocketChannel; private volatile boolean stop; public MultipexerTimeServer(String addr,int point){ try { selector=Selector.open(); serverSocketChannel=ServerSocketChannel.open(); serverSocketChannel.socket().bind(new InetSocketAddress(addr, point)); serverSocketChannel.configureBlocking(false); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); System.out.println("socket服务端:"+serverSocketChannel.socket().getInetAddress()+":"+serverSocketChannel.socket().getLocalPort()+""); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } public void stop(){ this.stop=true; } @Override public void run() { while(!stop){ try { selector.select(1000); Set<SelectionKey> selectionKeys=selector.selectedKeys(); if(selectionKeys !=null && selectionKeys.size()>0){ Iterator<SelectionKey> it=selectionKeys.iterator(); SelectionKey key=null; while(it.hasNext()){ key=it.next(); it.remove(); try { handleInput(key); } catch (Exception e) { if(key!=null){ key.cancel(); if(key.channel()!=null){ try { key.channel().close(); } catch (Exception e1) { e1.printStackTrace(); } } } } } } } catch (Exception e) { e.printStackTrace(); } } if(selector!=null){ try { selector.close(); } catch (Exception e) { e.printStackTrace(); } } } private void handleInput(SelectionKey key) throws IOException{ if(key.isValid()){ //处理新接入的请求 if(key.isAcceptable()){ ServerSocketChannel ssc=(ServerSocketChannel)key.channel(); SocketChannel sc=ssc.accept(); sc.configureBlocking(false); sc.register(selector,SelectionKey.OP_READ); SocketAddress clientAddress =sc.getRemoteAddress(); System.out.println("socket链接新客户端:" + clientAddress); } if(key.isReadable()){ //读取数据 SocketChannel sc=(SocketChannel)key.channel(); ByteBuffer readBuffer=ByteBuffer.allocate(1024); int readBytes=sc.read(readBuffer); if(readBytes>0){ readBuffer.flip(); byte[] bytes=new byte[readBuffer.remaining()]; readBuffer.get(bytes); String body=new String(bytes, Charset.forName("GBK")); SocketAddress clientAddress =sc.getRemoteAddress(); System.out.println("socket链接老客户端:" + clientAddress); System.out.println("服务器接收数据:"+body); //然后回写点数据给客服端 SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time=dateFormat.format(new Date()); String res="来自与服务端的回应,时间:"+ time; doWrite(sc,res); }else if(readBytes<0){ key.cancel(); sc.close(); }else{ //System.out.println("服务器收到0字节数据..."); } } } } private void doWrite(SocketChannel sc,String res) throws IOException{ if(res!=null && res.trim().length()>0){ byte[] bytes=res.getBytes(); ByteBuffer byteBuffer=ByteBuffer.allocate(1024); byteBuffer.put(bytes); byteBuffer.flip(); sc.write(byteBuffer); } }
代码不想解释太多,有空整理一下nio的基本概念...
相关文章推荐
- RxJava源代码剖析
- 安卓开发之java基础笔记8常用API
- struts2的form等表单布局问题,去掉其自动生成的<table><tr><td>标签
- Eclipse快捷键大全
- 安卓开发之java基础笔记7内部类与设计模式
- Spring MVC:原理与使用
- [转]彻底理解java aio,bio.nio 同步 异步 阻塞 非阻塞 同步阻塞 同步非阻塞 异步阻塞 异步非阻塞
- java线程池详解一
- HDU 1250 Hat's Fibonacci (Java大数,类似Fib数,有个坑!!)
- 集合中关于iterator遍历顺序的理解
- 对this的理解又提升了一个阶段
- Java注解学习-入门
- java内存模型与线程
- eclipse查看.class文件
- Java并发-Fork/Join框架
- java多线程
- spring 另开线程时的注入问题
- eclipse调试多线程
- java中NIO总结
- Eclipse搭建SSH(Struts2+Spring3+Hibernate3)框架项目教程