public class Dispacther implements Runnable{
private String host = "127.0.0.1";
private int port = 8080;
public final Selector selector;
public final ServerSocketChannel serverSocketChannel;
public Dispacther() throws IOException {
selector=Selector.open();
serverSocketChannel=ServerSocketChannel.open();
InetSocketAddress inetSocketAddress=new InetSocketAddress(this.host,this.port);
serverSocketChannel.socket().bind(inetSocketAddress);
serverSocketChannel.configureBlocking(false);
SelectionKey selectionKey=serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
selectionKey.attach(new Acceptor(this));
}
@Override
public void run() {
try {
while(!Thread.interrupted()){
selector.select();
Set<SelectionKey> selectionKeys= selector.selectedKeys();
Iterator<SelectionKey> it=selectionKeys.iterator();
while(it.hasNext()){
SelectionKey selectionKey=it.next();
dispatch(selectionKey);
selectionKeys.clear();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
void dispatch(SelectionKey key) {
Runnable r = (Runnable)(key.attachment());
if (r != null){
r.run();
}
}
}
public class Acceptor implements Runnable{
private Dispacther dispacther;
public Acceptor(Dispacther dispacther) {
this.dispacther = dispacther;
}
@Override
public void run() {
try {
SocketChannel socketChannel=dispacther.serverSocketChannel.accept();
if(socketChannel!=null)
new SocketHandler(dispacther.selector, socketChannel);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class SocketHandler implements Runnable {
private SocketChannel socketChannel;
private Charset charset = Charset.forName("UTF-8");
private Selector selector;
public SocketHandler(Selector selector,SocketChannel socketChannel) throws IOException{
this.socketChannel=socketChannel;
this.selector = selector;
socketChannel.configureBlocking(false);
SelectionKey selectionKey=socketChannel.register(selector, 0);
selectionKey.attach(this);
selectionKey.interestOps(SelectionKey.OP_READ);
selector.wakeup();
}
@Override
public void run() {
try {
ByteBuffer buff = ByteBuffer.allocate(1024);
String content = "";
while (socketChannel.read(buff) > 0) {
socketChannel.read(buff);
buff.flip();
content += charset.decode(buff);
}
if(!"".equals(content)){
System.out.println( " content : " + content);
for (SelectionKey key : this.selector.keys()) {
Channel targetChannel = key.channel();
if (targetChannel instanceof SocketChannel) {
SocketChannel dest = (SocketChannel) targetChannel;
dest.write(charset.encode(content));
dest.close();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
捐助开发者
在兴趣的驱动下,写一个免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(支持支付宝和微信 以及扣扣群),没钱捧个人场,谢谢各位。
个人主页:http://knight-black-bob.iteye.com/
谢谢您的赞助,我会做的更好!