package main;
import java.io.IOException;
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;
import java.util.Set;
/**
* @author doggy
* Created on 15-10-6.
*/
public class Server {
public static void main(String[] args){
try{
//open a selector
Selector selector = Selector.open();
//create a serversocketchannel and init
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.socket().bind(new InetSocketAddress());
//set it to non blocking,only in this way you can register it to a selector
ssc.configureBlocking(false);
//register to OP_ACCEPT,means when accpt this channel would add to selectedChannels
ssc.register(selector, SelectionKey.OP_ACCEPT);
while(true){
//blocked if no event coming
selector.select();
//get active channel
Set<SelectionKey> keys = selector.selectedKeys();
Iterator<SelectionKey> ite = keys.iterator();
while(ite.hasNext()){
try{
SelectionKey key = ite.next();
//for OP_ACCEPT
if(key.isAcceptable()){
ServerSocketChannel sscl = (ServerSocketChannel)key.channel();
SocketChannel sc = sscl.accept();
sc.configureBlocking(false);
sc.register(selector,SelectionKey.OP_READ);
System.out.println("connected");
//for OP_READ
}else if(key.isReadable()){
System.out.println("begin read");
//get channel
SocketChannel sc = (SocketChannel)key.channel();
ByteBuffer bb = ByteBuffer.allocate();
//deal with pipe diconnected
if(sc.read(bb) < ){
sc.close();
//cancel for register and remove it from selectedKeys
key.cancel();
continue;
}
int pos = bb.position();
bb.flip();
byte[] b = new byte[];
bb.get(b,,pos);
String s = new String(b);
System.out.println(s);
s = "hello "+s;
//attach message to key
key.attach(s);
//registe a write event
key.interestOps(SelectionKey.OP_WRITE);
System.out.println("end read");
//for OP_WRITE
}else if(key.isWritable()){
System.out.println("begin write");
SocketChannel sc = (SocketChannel)key.channel();
ByteBuffer bb;
//get attach message
String s = (String)key.attachment();
bb = ByteBuffer.wrap(s.getBytes());
sc.write(bb);
key.interestOps(SelectionKey.OP_READ);
System.out.println("end write");
}
}catch (Exception e){
e.printStackTrace();
} finally{
//remove it from selectedKey anyway
ite.remove();
}
}
}
}catch (IOException ioe){
ioe.printStackTrace();
}
}
}
package main;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
/**
* @author doggy
* Created on 15-10-6.
*/
public class Client {
public static void main(String[] args) throws Exception{
Socket socket = new Socket("127.0.0.1",);
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
Scanner in = new Scanner(System.in);
while(true){
String s = in.nextLine();
if(s.toLowerCase().equals("eof")){
socket.close();
break;
}
os.write(s.getBytes());
byte[] b = new byte[];
is.read(b);
System.out.println(new String(b));
}
}
}