자바 간단 한 웹 서버 인 스 턴 스 분석 실현

7506 단어 자바web서버
웹 서버 는 하이퍼텍스트 전송 프로 토 콜 서버 라 고도 부 릅 니 다.http 를 사용 하여 클 라 이언 트 와 통신 합 니 다.자바 기반 웹 서버 는 두 가지 중요 한 종 류 를 사용 합 니 다.
java.net.Socket 클래스 와 java.net.server Socket 클래스 는 http 메 시 지 를 보 내 는 것 을 기반 으로 통신 합 니 다.
이 간단 한 웹 서버 는 다음 과 같은 세 가지 종류 가 있 습 니 다.
*HttpServer
*Request
*Response
응용 프로그램의 입 구 는 HttpServer 클래스 에 있 습 니 다.main()방법 은 HttpServer 인 스 턴 스 를 만 든 다음 에 await()방법 을 호출 합 니 다.말 그대로await()방법 은 지정 한 포트 에서 HTTP 요청 을 기다 리 고 이 를 처리 한 다음 에 응답 메 시 지 를 클 라 이언 트 에 보 냅 니 다.닫 기 명령 을 받 기 전에 대기 상 태 를 유지 합 니 다.
이 프로그램 은 html 파일 과 이미지 등 지정 한 디 렉 터 리 에 있 는 정적 자원 에 대한 요청 만 보 냅 니 다.http 요청 바이트 흐름 을 콘 솔 에 표시 할 수 있 지만 날짜 나 cookies 등 헤더 정 보 를 브 라 우 저 에 보 내지 않 습 니 다.
다음은 이 몇 가지 종류의 소스 코드 입 니 다.
Request:

package cn.com.server;
import java.io.InputStream;
public class Request {
	private InputStream input;
	private String uri;
	public Request(InputStream input){
		this.input=input;
	}
	public void parse(){
		//Read a set of characters from the socket 
		StringBuffer request=new StringBuffer(2048);
		int i;
		byte[] buffer=new byte[2048];
		try {
			i=input.read(buffer);
		}
		catch (Exception e) {
			e.printStackTrace();
			i=-1;
		}
		for (int j=0;j<i;j++){
			request.append((char)buffer[j]);
		}
		System.out.print(request.toString());
		uri=parseUri(request.toString());
	}
	public String parseUri(String requestString){
		int index1,index2;
		index1=requestString.indexOf(" ");
		if(index1!=-1){
			index2=requestString.indexOf(" ",index1+1);
			if(index2>index1){
				return requestString.substring(index1+1,index2);
			}
		}
		return null;
	}
	public String getUri(){
		return this.uri;
	}
}
Request 클래스 는 HTTP 요청 을 표시 합 니 다.InputStream 대상 을 전달 하여 Request 대상 을 만 들 수 있 습 니 다.InputStream 대상 의read()방법 으로 HTTP 요청 의 원본 데 이 터 를 읽 을 수 있 습 니 다.
위 소스 코드 의parse()방법 은 Http 가 요청 한 원본 데 이 터 를 분석 하 는 데 사 용 됩 니 다.parse()방법 은 HTTP 가 요청 한 URI 를 개인 적 인 방법parseUrI()으로 처리 합 니 다.그 밖 에 많은 작업 을 하지 않 았 습 니 다.parseUri()방법 은 URI 를 변수 uri 에 저장 하고 공공 방법getUri()을 사용 하면 요청 한 uri 를 되 돌려 줍 니 다.
Response:

package cn.com.server;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
/** 
 * HTTP Response = Status-Line 
 *   *(( general-header | response-header | entity-header ) CRLF) 
 *   CRLF 
 *   [message-body] 
 *   Status-Line=Http-Version SP Status-Code SP Reason-Phrase CRLF 
 * 
 */
public class Response {
	private static final int BUFFER_SIZE=1024;
	Request request;
	OutputStream output;
	public Response(OutputStream output){
		this.output=output;
	}
	public void setRequest(Request request){
		this.request=request;
	}
	public void sendStaticResource()throws IOException{
		byte[] bytes=new byte[BUFFER_SIZE];
		FileInputStream fis=null;
		try {
			File file=new File(HttpServer.WEB_ROOT,request.getUri());
			if(file.exists()){
				fis=new FileInputStream(file);
				int ch=fis.read(bytes,0,BUFFER_SIZE);
				while(ch!=-1){
					output.write(bytes, 0, BUFFER_SIZE);
					ch=fis.read(bytes, 0, BUFFER_SIZE);
				}
			} else{
				//file not found 
				String errorMessage="HTTP/1.1 404 File Not Found\r
"+ "Content-Type:text/html\r
"+ "Content-Length:23\r
"+ "\r
"+ "<h1>File Not Found</h1>"; output.write(errorMessage.getBytes()); } } catch (Exception e) { System.out.println(e.toString()); } finally{ if(fis!=null){ fis.close(); } } } }
Response 대상 은 HttpServer 클래스await()방법 에서 소켓 에 전 송 된 OutputStream 을 통 해 생 성 됩 니 다.
Response 클래스 는 두 가지 공공 방법 이 있 습 니 다.setRequest()sendStaticResource() ,setRequest()방법 은 Request 대상 을 매개 변수 로 받 습 니 다.sendStaticResource()방법 은 Html 파일 과 같은 정적 자원 을 브 라 우 저 로 보 내 는 데 사 용 됩 니 다.
HttpServer:

package cn.com.server;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class HttpServer {
	/** 
   * WEB_ROOT is the directory where our html and other files reside. 
   * For this package,WEB_ROOT is the "webroot" directory under the 
   * working directory. 
   * the working directory is the location in the file system 
   * from where the java command was invoke. 
   */
	public static final String WEB_ROOT=System.getProperty("user.dir")+File.separator+"webroot";
	private static final String SHUTDOWN_COMMAND="/SHUTDOWN";
	private Boolean shutdown=false;
	public static void main(String[] args) {
		HttpServer server=new HttpServer();
		server.await();
	}
	public void await(){
		ServerSocket serverSocket=null;
		int port=8080;
		try {
			serverSocket=new ServerSocket(port,1,InetAddress.getByName("127.0.0.1"));
		}
		catch (Exception e) {
			e.printStackTrace();
			System.exit(0);
		}
		while(!shutdown){
			Socket socket=null;
			InputStream input=null;
			OutputStream output=null;
			try {
				socket=serverSocket.accept();
				input=socket.getInputStream();
				output=socket.getOutputStream();
				//create Request object and parse 
				Request request=new Request(input);
				request.parse();
				//create Response object 
				Response response=new Response(output);
				response.setRequest(request);
				response.sendStaticResource();
			}
			catch (Exception e) {
				e.printStackTrace();
				continue;
			}
		}
	}
}
이 클래스 는 웹 서버 를 표시 합 니 다.이 웹 서버 는 지정 한 디 렉 터 리 의 정적 자원 에 대한 요청 을 처리 할 수 있 습 니 다.이 디 렉 터 리 는 공유 정적 변수 final WEB 를 포함 합 니 다.ROOT 가 가리 키 는 디 렉 터 리 와 모든 하위 디 렉 터 리.
현재 웹 루트 에 html 페이지 를 만 듭 니 다.index.html 라 고 명명 되 었 습 니 다.원본 코드 는 다음 과 같 습 니 다.

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title>Insert title here</title> 
</head> 
<body> 
  <h1>Hello World!</h1> 
</body> 
</html> 
현재 이 WEB 서버 를 시작 하고 index.html 정적 페이지 를 요청 합 니 다.

대응 하 는 콘 솔 의 출력:

이렇게 해서 간단 한 http 서버 가 완성 되 었 습 니 다.
총결산
이상 은 자바 가 간단 한 웹 서버 인 스 턴 스 분석 을 실현 하 는 모든 내용 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.관심 이 있 는 친 구 는 본 사이트 의 다른 관련 주 제 를 계속 참고 할 수 있 습 니 다.부족 한 점 이 있 으 면 댓 글로 지적 해 주 십시오.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기