package online.server.proxy.http;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
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 NIOServer extends Thread {
private InetSocketAddress address;
/**
* @param port
*/
public NIOServer(int port){
this.address = new InetSocketAddress(port);
}
/**
* @param address
*/
public NIOServer(InetSocketAddress address){
this.address = address;
}
@Override
public void run() {
try {
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.configureBlocking(false);
ServerSocket ss = ssc.socket();
ss.bind(this.address);
Selector seltor = Selector.open();
ssc.register(seltor, SelectionKey.OP_ACCEPT);
while (true) {
seltor.select();
Set keys = seltor.selectedKeys();
Iterator it = keys.iterator();
while (it.hasNext()) {
SelectionKey sKey = it.next();
it.remove();
if (sKey.isAcceptable()) {
ServerSocketChannel serv = (ServerSocketChannel) sKey.channel();
SocketChannel sc = serv.accept();
sc.configureBlocking(true);
new ChannelThread(sc).start();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package online.server.proxy.http;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
public class ChannelThread extends Thread {
/* 缓冲区大小 */
private static int BUF = 1024;
/* 发送数据缓冲区 */
private static ByteBuffer receivebuffer = ByteBuffer.allocate(BUF);
/* 接收数据缓冲区 */
private static ByteBuffer sendbuffer = ByteBuffer.allocate(BUF);
private SocketChannel sc;
public ChannelThread(SocketChannel sc) {
this.sc = sc;
}
@Override
public void run() {
try{
while(true){
receivebuffer.clear();
int count = sc.read(receivebuffer);
if (count > 0) {
String receiveText = new String(receivebuffer.array(), 0, count);
System.out.println("服务器端接受客户端数据--:" + receiveText);
}
String sendText = "message from server--";
sendbuffer.clear();
sendbuffer.put(sendText.getBytes());
sendbuffer.flip();
// 输出到通道
sc.write(sendbuffer);
}
}catch(Exception e){
e.printStackTrace();
}
}
}