浏览 3328 次
锁定老帖子 主题:JAVA NIO入门实例
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-09-14
基本概念:参考http://zhangshixi.iteye.com/blog/679959作者的系列文章即可
我自己读完作者的文章,写了一个简单的DEMO 服务端: package com.liuc.io; 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.nio.charset.Charset; import java.util.Iterator; import java.util.Set; import org.apache.log4j.Logger; public class NIOServer extends Thread { private Logger log=Logger.getLogger(NIOServer.class); private boolean stop=false; private String ip="localhost"; private int port=9999; private Selector selector; private ByteBuffer buffer=ByteBuffer.allocate(1024); private Charset gbkCharset = Charset.forName( "GB2312" ); public NIOServer() { try { selector=Selector.open(); ServerSocketChannel ssc=ServerSocketChannel.open(); InetSocketAddress address=new InetSocketAddress(ip, port); //ServerSocket绑定IP ssc.socket().bind(address); //设置为非阻塞模式 ssc.configureBlocking(false); //向选择器注册 ssc.register(selector,SelectionKey.OP_ACCEPT); System.out.println("Listen to port:"+port); } catch (IOException e) { log.error(e); } } @Override public void run() { System.out.println("deal with request"); while(!stop){ String content="HelloWorld"; try { int numKeys = selector.select(); Set<SelectionKey> selectionKeys=selector.selectedKeys(); Iterator<SelectionKey> iterator=selectionKeys.iterator(); while (iterator.hasNext()) { SelectionKey key = iterator.next(); iterator.remove(); dealRequest(key,content); } } catch (IOException e) { log.equals(e); } } } private void dealRequest(SelectionKey key,String contentToSend) { try { StringBuffer clientContent=new StringBuffer(); if(key.isAcceptable()){//测试此键的通道是否已准备好接受新的套接字连接。 ServerSocketChannel ssc=(ServerSocketChannel) key.channel(); SocketChannel sc=ssc.accept(); sc.configureBlocking(false); sc.register(selector, SelectionKey. OP_READ); }else if(key.isReadable()) {//测试此键的通道是否已准备好进行读取。 SocketChannel sc=(SocketChannel) key.channel(); while(true){//读取全部数据 buffer.clear(); int r=sc.read(buffer); buffer.flip(); byte[] temp=new byte[r]; if (r<=0) { break; } clientContent.append(gbkCharset.decode(buffer).toString()); } //获取全部的数据 String content=clientContent.toString(); String[] info=content.split(",");//用户名密码验证 System.out.println("客户端的验证请求为:"+content); sc.register(selector, SelectionKey.OP_WRITE); }else if(key.isWritable()){//测试此键的通道是否已准备好进行写入 System.out.println("要发送的消息为"+contentToSend); buffer.clear(); buffer.put(contentToSend.getBytes()); buffer.flip(); SocketChannel sc = (SocketChannel)key.channel(); sc.write(buffer); buffer.flip(); //发送完信息后关闭连接 key.cancel(); sc.close(); } } catch (IOException e) { System.out.println(e); //客户端断开连接,所以从Selector中取消注册 key.cancel(); if(key.channel() != null) try { key.channel().close(); log.debug("the client socket is closed!"); //System.out.println("the client socket is closed!"); } catch (IOException e1) { e1.printStackTrace(); } } } public static void main(String[] args){ new NIOServer().start(); } } [size=medium]客户端:[/size] 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-09-20
怎么确定每个客户端的唯一标示符呢
|
|
返回顶楼 | |