MultiThreadEchoServeReactor.java 回显服务器
package com.netty.im.Reactor.mutilThread;
import java.io.IOException;
import java.net.InetSocketAddress;
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;
import java.util.concurrent.atomic.AtomicInteger;
public class MultiThreadEchoServeReactor {
ServerSocketChannel serverSocket;
AtomicInteger next = new AtomicInteger(0);
Selector[] selectors = new Selector[2];
SubReactor[] subReactors;
MultiThreadEchoServeReactor() throws IOException {
selectors[0] = Selector.open();
selectors[1] = Selector.open();
InetSocketAddress address = new InetSocketAddress("127.0.0.1", 8080);
serverSocket.socket().bind(address);
serverSocket.configureBlocking(false);
SelectionKey sk = serverSocket.register(selectors[0], SelectionKey.OP_ACCEPT);
sk.attach(new AcceptHandler());
SubReactor subReactor1 = new SubReactor(selectors[0]);
SubReactor subReactor2 = new SubReactor(selectors[1]);
subReactors = new SubReactor[]{subReactor1, subReactor2};
}
private void startService() {
new Thread(subReactors[0]).start();
new Thread(subReactors[1]).start();
}
private void dispatch(SelectionKey sk) {
Runnable handle = (Runnable) sk.attachment();
if(null != handle) {
handle.run();
}
}
class AcceptHandler implements Runnable {
@Override
public void run() {
try {
SocketChannel channel = serverSocket.accept();
if(channel != null) {
new MultiThreadEchoHandler(selectors[next.get()], channel);
}
}catch (IOException ex) {
ex.printStackTrace();
}
if(next.incrementAndGet() == selectors.length) {
next.set(0);
}
}
}
class SubReactor implements Runnable {
private Selector selector;
SubReactor(Selector selector) {
this.selector = selector;
}
@Override
public void run() {
try {
while (!Thread.interrupted()) {
selector.select();
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> it = selectedKeys.iterator();
while (it.hasNext()) {
SelectionKey sk = it .next();
dispatch(sk);
} }
}catch (IOException ex) {
ex.printStackTrace();
}
}
}
}