基本概念:参考http://zhangshixi.iteye.com/blog/679959作者的系列文章即可
NIO因为其高效性,成为了服务端的首选,大大提高了服务端的响应效率。
我自己读完作者的文章,写了一个简单的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();
}
}
客户端:
package com.liuc.io;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class NIOClient {
/**
* @param args
*/
public static void main(String[] args) {
Socket socket=null;
OutputStream outputStream=null;
InputStream inputStream=null;
try {
socket=new Socket("localhost", 9999);
outputStream=socket.getOutputStream();
String sendContent="HelloWorld";
outputStream.write(sendContent.getBytes());
outputStream.flush();
inputStream=socket.getInputStream();
byte[] bytes=new byte[1024];
int n=inputStream.read(bytes);
System.out.println(new String(bytes));
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(inputStream!=null){
inputStream.close();
}
if (outputStream!=null) {
outputStream.close();
}
if (socket!=null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
[第4节] JavaNIO流-通道1.flv [第5节] Java NIO流-通道2.flv [第6节] Java NIO流-socket通道操作.flv [第7节] Java NIO流-文件通道操作.flv [第8节] Java NIO流-选择器 .flv [第9节] Java NIO流-选择器操作.flv...
Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...
Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...
javanio.zip 23.NIO非阻塞通信(Socket/UDP实例、简单聊天系统) javarmi.zip 24.RMI编程(HelloWorld例、计算器实例) javacorba.zip 25.Corba编程(HelloWorld例、计算器实例) 第6部分(4个程序包) java...
javanio.zip 23.NIO非阻塞通信(Socket/UDP实例、简单聊天系统) javarmi.zip 24.RMI编程(HelloWorld例、计算器实例) javacorba.zip 25.Corba编程(HelloWorld例、计算器实例) 第6部分(4个程序包) java...
javanio.zip 23.NIO非阻塞通信(Socket/UDP实例、简单聊天系统) javarmi.zip 24.RMI编程(HelloWorld例、计算器实例) javacorba.zip 25.Corba编程(HelloWorld例、计算器实例) 第6部分(4个程序包) java...
内容简介:此书结合具体实例讲解,通俗易懂,又不乏深度。我觉得这本书写的确实不错,堪称经典,市面上这样的书实在太少了,所以在这里发布下,供大家共享。本书从编程技术、项目实践以及软件工程的角度出发,如果...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...