1、Server
package server;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
public class Server {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
InetSocketAddress address = new InetSocketAddress("127.0.0.1", 8080);
try {
Selector acceptSelector = Selector.open();
Selector ioSelector = Selector.open();
ServerSocketChannel ssChannel = ServerSocketChannel.open();
ssChannel.configureBlocking(false);
ssChannel.socket().bind(address);
ssChannel.register(acceptSelector, SelectionKey.OP_ACCEPT);
AcceptThread acceptThread = new AcceptThread();
IOThread ioThread = new IOThread();
ioThread.setSelector(ioSelector);
acceptThread.setAcceptSelector(acceptSelector);
acceptThread.setIOSelector(ioSelector);
ioThread.start();
acceptThread.start();
ioThread.join();
acceptThread.join();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2、AcceptThread
package server;
import java.io.IOException;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
public class AcceptThread extends Thread {
private Selector selector;
private Selector ioSelector;
public void setAcceptSelector(Selector acceptSelector) {
this.selector = acceptSelector;
}
public void setIOSelector(Selector ioSelector) {
this.ioSelector = ioSelector;
}
public void run() {
while(true) {
int keys = 0;
try {
keys = selector.select();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(keys > 0) {
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> it = selectedKeys.iterator();
while(it.hasNext()) {
SelectionKey key = it.next();
if(key.isAcceptable()) {
System.out.println("Accept: accept");
ServerSocketChannel ssChannel = (ServerSocketChannel) key.channel();
try {
SocketChannel channel = ssChannel.accept();
channel.configureBlocking(false);
ioSelector.wakeup();
channel.register(ioSelector, SelectionKey.OP_READ);
System.out.println("Accept: register");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
it.remove();
}
}
}
}
}
3、IOThread
package server;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
public class IOThread extends Thread {
private Selector selector;
public void setSelector(Selector selector) {
this.selector = selector;
}
public void run() {
ByteBuffer buffer = ByteBuffer.allocate(1024);
while(true) {
int keys = 0;
try {
keys = selector.select();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(keys > 0) {
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> it = selectedKeys.iterator();
while(it.hasNext()) {
SelectionKey key = it.next();
if(key.isReadable()) {
System.out.println("IO: read");
SocketChannel channel = (SocketChannel) key.channel();
try {
buffer.clear();
int i = channel.read(buffer);
System.out.println(i);
if(i < 0) channel.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//key.interestOps(SelectionKey.OP_WRITE);
try {
channel.register(selector, SelectionKey.OP_WRITE);
} catch (ClosedChannelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else if(key.isWritable()) {
System.out.println("IO: write");
SocketChannel channel = (SocketChannel) key.channel();
//key.interestOps(SelectionKey.OP_READ);
try {
channel.register(selector, SelectionKey.OP_READ);
} catch (ClosedChannelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
it.remove();
}
}
}
}
}
4、client
package lions.common.net.nio.client.old.test;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
public class BigSocketTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Socket socket = new Socket();
InetSocketAddress address = new InetSocketAddress("127.0.0.1", 8080);
try {
socket.connect(address);
OutputStream os = socket.getOutputStream();
byte[] bytes = new byte[1024 * 1024];
for(int i=0;i<1000;i++) {
os.write(bytes);
os.flush();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(i);
}
os.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}