package testreadline;
import java.net.*;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.nio.charset.*;
import java.util.concurrent.*;
import java.io.*;
public class test {
public static void main(String[] args) throws IOException {
new SimpleHttpServer().service();
}
}
class SimpleHttpServer {
private int port = 80;
private ServerSocketChannel serverSocketChannel = null;
private ExecutorService executorService;
private static final int POOL_MULTIPLE = 4;
public SimpleHttpServer() throws IOException
{
executorService = Executors.newFixedThreadPool(Runtime.getRuntime()
.availableProcessors() * POOL_MULTIPLE);
serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().setReuseAddress(true);
serverSocketChannel.socket().bind(new InetSocketAddress(port));
}
public void service() {
while (true) {
SocketChannel socketChannel = null;
try {
socketChannel = serverSocketChannel.accept();
executorService.execute(new Handler(socketChannel));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class Handler implements Runnable {
private SocketChannel socketChannel;
public Handler(SocketChannel socketChannel) {
this.socketChannel = socketChannel;
}
@Override
public void run() {
handle(socketChannel);
}
private void handle(SocketChannel socketChannel) {
try {
Socket socket = socketChannel.socket();
System.out.println(socket.getInetAddress() + ":" + socket.getPort());
String info = "HTTP/1.1 200 OK\n" +
"Server: Apache-Coyote/1.1\n" +
"Content-Type: text/html;charset=utf-8\n" +
"Content-Length: 1021\n" +
"Date: Wed, 09 Dec 2009 05:00:27 GMT\n" +
"\n";
OutputStream os = socket.getOutputStream();
os.write(info.getBytes("utf-8"));
os.flush();
String html="<H1>港港都是泪,还是早停困!</H1>";
os.write(html.getBytes("utf-8"));
os.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socketChannel != null)
socketChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private Charset charset = Charset.forName("GBK");
private ByteBuffer encode(String string) {
return ByteBuffer.allocate(string.length() * 2).get(
string.getBytes(charset));
}
private String decode(ByteBuffer buffer) {
byte[] source = new byte[buffer.position() + 1];
buffer.put(source);
return new String(source, charset);
}
}