服务器端
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;
public class NIOServer {
public static void main(String[] args) throws Exception {
Selector selector=Selector.open();
ServerSocketChannel serverchannel=ServerSocketChannel.open();
serverchannel.configureBlocking(false);//设置为非阻塞 (必须)
serverchannel.socket().bind(new InetSocketAddress(8998));
serverchannel.register(selector, SelectionKey.OP_ACCEPT);//向监听器注册一个Accept事件
while(selector.select()>0) {
Iterator ite=selector.selectedKeys().iterator();//获取监听器的事件
while(ite.hasNext()) {
SelectionKey key=(SelectionKey) ite.next();
if(key.isAcceptable()) {
ServerSocketChannel serverchan=(ServerSocketChannel) key.channel();
SocketChannel sockchan=serverchan.accept();//接受
sockchan.configureBlocking(false);
sockchan.write(ByteBuffer.wrap(new String("我是服务器端第一次见面").getBytes()));
// 在客户端 连接成功之后,为了可以接收到客户端的信息,需要给通道设置读的权限
sockchan.register(selector, SelectionKey.OP_READ);
}else if(key.isReadable()) {
SocketChannel channel = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer);
byte[] data = buffer.array();
System.out.println(new String(data));
channel.register(selector, SelectionKey.OP_WRITE);
}else if(key.isWritable()) {
SocketChannel channel = (SocketChannel) key.channel();
ByteBuffer outBuffer = ByteBuffer.wrap("我是服务器端不是第一次见面".getBytes());
channel.write(outBuffer);
channel.register(selector, SelectionKey.OP_READ);
}
ite.remove();//移出当前处理的事件
}
}
}
}
客户端
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
public class NIOClient {
public static void main(String[] args) throws Exception {
Selector selector = Selector.open();
SocketChannel channel = SocketChannel.open(); // 设置通道为非阻塞
channel.configureBlocking(false); // 获得一个通道管理器
// 用channel.finishConnect();才能完成连接
channel.connect(new InetSocketAddress("127.0.0.1",8998));
// 将通道管理器和该通道绑定,并为该通道注册SelectionKey.OP_CONNECT事件。
channel.register(selector, SelectionKey.OP_CONNECT);
while (selector.select()>0) {
Iterator ite = selector.selectedKeys().iterator();
while (ite.hasNext()) {
SelectionKey key = (SelectionKey) ite.next(); // 删除已选的key,以防重复处理
if (key.isConnectable()) {
SocketChannel channels = (SocketChannel) key.channel(); // 如果正在连接,则完成连接
if (channels.isConnectionPending()) { //如果已完成3次握手
channels.finishConnect(); //那么完成连接,建立通道
} // 设置成非阻塞
channels.configureBlocking(false);
// 在这里可以给服务端发送信息哦
channels.write(ByteBuffer.wrap(new String("我是客户端哦第一次见面").getBytes()));
// 在和服务端连接成功之后,为了可以接收到服务端的信息,需要给通道设置读的权限。
channels.register(selector, SelectionKey.OP_READ); // 获得了可读的事件
} else if (key.isReadable()) {
SocketChannel channels = (SocketChannel) key.channel();
// 穿件读取的缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
channels.read(buffer);
byte[] data = buffer.array();
System.out.println(new String(data));
channels.register(selector, SelectionKey.OP_WRITE);
} else if(key.isWritable()) {
SocketChannel channels = (SocketChannel) key.channel();
ByteBuffer outBuffer = ByteBuffer.wrap("我是客户端不是第一次见面".getBytes());
channels.write(outBuffer);
channels.register(selector, SelectionKey.OP_READ);
}
ite.remove(); // 移出当前处理的事件
}
}
}
}
具体教程可看 http://ifeve.com/selectors/ ,http://ifeve.com/socket-channel/ ,http://ifeve.com/server-socket-channel/