增加了一个写线程,这次真的是完整了。
修改了以下文件,其他没变。
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();
WriteThread writeThread = new WriteThread();
ioThread.setSelector(ioSelector);
ioThread.setThread(writeThread);
acceptThread.setAcceptSelector(acceptSelector);
acceptThread.setIOSelector(ioSelector);
writeThread.setSelector(ioSelector);
ioThread.start();
acceptThread.start();
writeThread.start();
ioThread.join();
acceptThread.join();
writeThread.join();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2、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;
private WriteThread writeThread;
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();
writeThread.setChannel(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();
}
}
}
}
public void setThread(WriteThread writeThread) {
// TODO Auto-generated method stub
this.writeThread = writeThread;
}
}
3、WriteThread
package server;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
public class WriteThread extends Thread {
private SocketChannel channel;
private Selector selector;
public void setChannel(SocketChannel channel) {
this.channel = channel;
}
public void setSelector(Selector selector) {
this.selector = selector;
}
public void run() {
while(true) {
if(channel != null) {
try {
channel.register(selector, SelectionKey.OP_WRITE);
} catch (ClosedChannelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
break;
}
} else {
try {
this.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}