Site Search :
Standard Enterprise XML Methodology Pattern Setting Tunning Other
Article Contributors
GuestBook
Javapattern Maven
XSourceGen Dev
JetSpeed Test
JLook Image
jLook Family Site


Making the Http WebServer(Java로 web server를 구현하는 방법)
 
Network, Stream I/O, Multi-Thread Programming 이해
Server Application 구조, Thread Pooling, Logging, Dynamic Configuration 기능 이해 ( 2003/02/28 ) 331
Written by specular - 전홍성
2 of 3
 
<font face='굴림'>2. HttpWebServer - Network Server Application  
     이번에는 Network Server Application구 구조에 대한 이해와 HttpWebServer class의
     구현에 대한 내용을 소개합니다. Server App는 Connection을 Listen하는 Daemon Thread와
     Connection후의 request를 처리하는 Handler Thread로 구성이 됩니다. 
  Connection을 Listen하는 Daemon Thread의 간단한 예는 다음과 같이 구현할수 있습니다. 
import java.io.*;
import java.net.*;

/*
 *	Server App Example
 *	2001.05.16
 * 	written by Jeon HongSeong
 */
public class Listen implements Runnable 
{
private ServerSocket server;

public Listen() {
	try {
		//1. Intanciate a ServerSocket object.
		server = new ServerSocket(8080);
	} catch(IOException e) {
		e.printStackTrace();
		System.exit(0);
	}
}

public static void main(String args[]) 
{
	Listen listener = new Listen();
	Thread t = new Thread(listener);
	t.start();
}

public void run() 
{
	try {
		while(true) 
		{
			System.out.println("Listen...");
			//2. listen...
			Socket sck = server.accept();
			String client=sck.getInetAddress().getHostAddress();
			System.out.println(client+" is connected.");
			
			//3. handler thread start(pass the socket)
		}
	} catch(IOException e) {
		e.printStackTrace();
	}
}
}
▶ Listen.java
Test : web browser에서 http://localhost:8080 해 보면 되겠죠. 

위에서 ServerSocket객체의 accpet() 메소드는 client connection을 시도해 올때까지 
block되어진다. client가 connection을 시도하면, 이때 8080 port로 connection을 시도해야겠죠. 
nofity되어 connection을 시도한 client를 위해 허용가능한 임의의 port를 할당하고, 
client에 connection정보를 갖고 있는 Socket객체를 return한다. 
return된 Socket객체는 SocketImpl객체를 instance변수로 갖고 있고, 
SocketImplFactory를 class 변수로 갖고 있다. SocketImplfactory interface는 Factory object이고, 
SocketImpl객체는 실재 연결정보를 갖고 있는 객체입니다. 
그래서, port no, InetAddress, InputStream, OutputStream의 정보를 갖고 있죠.
client의 connection이 이루어 지면, request를 처리하기 위한 Handler thread를 
start시켜, Handler thread에 의해 request를 처리하고 response하게끔 구현하면 됩니다. 
HttpWebServer의 application source는 다음과 같습니다. 
package com.specular.http;

import java.io.*;
import java.net.*;
import java.util.*;
import com.specular.util.LogManager;
import com.specular.util.PropManager;

/*
*	HttpWebServer.java - Server Application
*	2001.05.17
* 	written by Jeon HongSeong
*/
public class HttpWebServer implements Runnable 
{	
private ServerSocket servSocket;
private boolean	SHUTTDOWN;

public HttpWebServer() 
	throws StartUpException 
{
	try {
		//PropManger 생성
		String port = PropManager.getInstance().getProperty("port","8080");
		PropManager.getInstance().list();
		//MimeDB data를 loading
		MimeDB.list();
		
		servSocket = new ServerSocket(Integer.parseInt(port));
	} catch(IOException e) {
		LogManager.log(e,"at the HttpWebServer() Constructor");
		throw new StartUpException(e.getMessage());	
	}
}
	
public static void main(String args[]) 
	throws StartUpException 
{
	
	HttpWebServer server = new HttpWebServer();
	Thread t = new Thread(server);
	t.start();
	LogManager.log("The HttpWebServer is started.");
	LogManager.log("The Listening port is 8080.");
}

public void run() 
{
	SHUTTDOWN=true;
	//Thread pooling object
	HandlerPool pool = HandlerPool.getInstance();	
	while(SHUTTDOWN) 
	{
		try {
			// waiting...(listening a connection.)
			Socket sck = servSocket.accept();
			LogManager.log(sck.getInetAddress().getHostAddress()+" is connected.");
			
			// Thread pooling....
			pool.execute(sck);				
		} catch(IOException e) {
			LogManager.log(e,"at the HttpWebServer.run() method.");
			SHUTTDOWN=false;
		}
	}
}
}
▶ HttpWebServer.java
▶ StartUpException.java





2001.05.18 written by Jeon HongSeong 
 
1 2 3
References
 
This article Source
webserver.jar
Copyright ⓒ 2003 www.javapattern.info & www.jlook.com, an jLOOK co.,LTD