|
자바네트워크I/O |
[1] |
|
등록일:2008-05-08 10:08:43 (0%) 작성자: 제목:NIO를 이용한 Super Simple 웹서버 |
|
package mySource;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
import java.util.*;
import java.io.*;
public class SuperSimpleWebServer
{
private Selector selector = null;
private ServerSocketChannel serverSocketChannel = null;
private CharsetDecoder decoder = null;
private ByteBuffer initBuffer = null;
public SuperSimpleWebServer()
{
try
{
selector = Selector.open();
serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.socket().bind(new InetSocketAddress(80));
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
decoder = Charset.forName("MS949").newDecoder();
this.initServer();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void initServer()
{
try
{
initBuffer = ByteBuffer.allocateDirect(90);
initBuffer.put("HTTP/1.1 200 OK\n".getBytes());
initBuffer.put("Connection: close\n".getBytes());
initBuffer.put("Server: SimpleWebServer\n".getBytes());
initBuffer.put("Content-Type: text/html\n".getBytes());
initBuffer.put("\n".getBytes());
initBuffer.flip();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void startWebServer()
{
while(true)
{
try
{
selector.select();
Iterator iter = selector.selectedKeys().iterator();
while(iter.hasNext())
{
SelectionKey key = (SelectionKey)iter.next();
if(key.isAcceptable())
{
//accept 처리
this.clientAccept(key);
}
else if(key.isReadable())
{
//read 처리
this.clientRead(key);
}
iter.remove();
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
private void clientAccept(SelectionKey key)
{
try
{
ServerSocketChannel ssc = (ServerSocketChannel)key.channel();
SocketChannel socketChannel = ssc.accept();
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
System.out.println(socketChannel.socket().getInetAddress() + " 클라이언트가 접속했습니다.");
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void clientRead(SelectionKey key)
{
ByteBuffer buffer = null;
SocketChannel sc = null;
String fileName = null;
StringTokenizer token = null;
try
{
buffer = ByteBuffer.allocateDirect(1024);
sc = (SocketChannel)key.channel();
sc.read(buffer);
buffer.flip();
token = new StringTokenizer(decoder.decode(buffer).toString(), " ");
token.nextToken();
fileName = token.nextToken();
buffer.clear();
buffer = null;
if(fileName.equals("/"))
{
fileName = "index.html";
}
else
{
fileName = fileName.substring(1);
}
}
catch(Exception e)
{
try
{
sc.close();
}
catch(Exception ex)
{
}
}
this.fileSend(fileName, sc);
}
private void fileSend(String fileName, SocketChannel sc)
{
File file = null;
MappedByteBuffer mbuffer = null;
FileChannel fc = null;
FileInputStream fis = null;
try
{
file = new File(fileName);
fis = new FileInputStream(file);
fc = fis.getChannel();
mbuffer = fc.map(FileChannel.MapMode.READ_ONLY, 0L, fc.size());
sc.write(this.initBuffer);
sc.write(mbuffer);
this.initBuffer.rewind();
}
catch(FileNotFoundException e)
{
// 404 에러
this.errorMessageSend("404", sc);
}
catch(IOException ex)
{
// 500 에러
this.errorMessageSend("500", sc);
}
finally
{
try
{
mbuffer.clear();
mbuffer = null;
fis.close();
fc.close();
sc.close();
}
catch(Exception ex)
{
}
}
}
private void errorMessageSend(String msg, SocketChannel sc)
{
ByteBuffer buffer = null;
try
{
System.out.println(sc.socket().getInetAddress() + " 클라이언트에게 에러 메시지 전송 : " + msg);
buffer = ByteBuffer.allocateDirect(70);
buffer.put("HTTP/1.0 ".getBytes());
buffer.put(msg.getBytes());
buffer.put(" OK\n".getBytes());
buffer.put("Connection: close\n".getBytes());
buffer.put("Server: SimpleWebServer\n".getBytes());
buffer.put("\n".getBytes());
buffer.flip();
sc.write(buffer);
}
catch(Exception e)
{
}
finally
{
try
{
buffer.clear();
buffer = null;
sc.close();
}
catch(Exception ex)
{
}
}
}
public static void main(String[] args)
{
SuperSimpleWebServer webServer = new SuperSimpleWebServer();
webServer.startWebServer();
}
} |
[본문링크] NIO를 이용한 Super Simple 웹서버
|
[1]
|
|
|
|
|
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=7529 |
|
|
|
|
|
|
|
|
|
Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.
|
|
|