java.net.socket 및 java.net.serversocket을 기반으로 비교적 간단한 간단한 Java 웹 서버 구현;
1. 프로그램 실행 단계
1. 서버 소켓 객체를 만듭니다.
2. 서버 소켓 객체의 수락 메소드를 호출하고 연결을 기다립니다. 연결이 성공하면 소켓 객체가 반환됩니다. 그렇지 않으면 차단되고 기다립니다.
3. 소켓 객체에서 입력 스트림 및 출력 스트림 바이트 스트림을 가져 오고이 두 스트림은 각각 요청 요청 및 응답 응답에 해당합니다.
4. 요청 처리 : 입력 스트림 바이트 스트림 정보를 읽고 문자열 양식으로 변환 한 다음 구문 분석하십시오. 여기서 구문 분석은 비교적 간단하며 URI (균일 자원 식별자) 정보 만 얻습니다.
5. 처리 응답 : 구문 분석 된 URI 정보를 기반으로 Web_Root 디렉토리에서 요청 된 리소스 리소스 파일을 찾아서 리소스 파일을 읽고 outputStream 바이트 스트림에 쓰십시오.
6. 소켓 객체를 닫습니다.
7. 2 단계로 이동하여 연결 요청을 계속 기다리십시오.
2. 코드 구현
서버 구현 :
패키지 ex01.pyrmont; import java.net.socket; import java.net.serversocket; import java.net.inetaddress; import java.io.inputStream; import java.io.outputstream; import java.io.ioexception; import java.io.file; public class httpser httml and where httml and where the the httpsml and httpsver r. 다른 파일이 저장됩니다. 여기서 Web_Root는 Working Directory*/ public static final String web_root = system.getProperty ( "user.dir") + file.separator + "webroot"의 Webroot 디렉토리입니다. // 서비스 명령을 닫습니다. 개인 정적 최종 문자열 shutdown_command = "/shutdown"; public static void main (String [] args) {httpserver server = new httpserver (); // 연결 요청 서버를 기다립니다 .await (); } public void await () {serversocket serversocket = null; int port = 8080; {// Server Socket Object Serversocket = New Serversocket (포트, 1, inetAddress.getByName ( "127.0.0.1")); } catch (ioexception e) {e.printstacktrace (); System.exit (1); } // 요청을 기다리기 위해 루핑 (true) {소켓 소켓 = null; inputStream input = null; 출력 스트림 출력 = NULL; 시도 {// 연결을 기다리는 대기, 연결이 성공한 후 소켓 객체 소켓을 반환 = serversocket.accrect (); 입력 = socket.getInputStream (); output = socket.getoutPutStream (); // 요청 객체 생성 및 구문 분석 요청 요청 = 새 요청 (입력); request.parse (); // 닫힌 서비스 명령인지 확인 if (request.geturi (). equals (shutdown_command)) {break; } // 응답 생성 객체 응답 = 새 응답 (출력); Response.SetRequest (요청); 응답 .SendStaticResource (); // 소켓 객체 socket.close (); } catch (예외 e) {e.printstacktrace (); 계속하다; }}}}요청 클래스 :
패키지 ex01.pyrmont; import java.io.inputStream; import java.io.ioexception; 공개 클래스 요청 {private inputstream input; 개인 문자열 URI; 공개 요청 (inputStream input) {this.input = 입력; } // inputStream에서 요청 정보를 읽고 요청에서 URI 값을 가져옵니다. public void parse () {StringBuffer Request = new StringBuffer (2048); int i; 바이트 [] 버퍼 = 새로운 바이트 [2048]; try {i = input.read (버퍼); } catch (ioexception 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 ()); } /** * * requestString의 형태는 다음과 같습니다. * get /index.html http /1.1 * 호스트 : 로컬 호스트 : 8080 * 연결 : Keep-alive * 캐시-콘트롤 : max-age = 0 * ... *이 함수의 목적은 /index.html 문자열 * /private string parseuri (string requestring) {int indely 2,; index1 = requestString.indexof ( ''); if (index1! = -1) {index2 = requestString.indexof ( '', index1 + 1); if (index2> index1) return returestring.substring (index1 + 1, index2); } return null; } public String getUri () {return uri; }} 응답 클래스 :
패키지 ex01.pyrmont; import java.io.outputStream; import java.io.ioexception; import java.io.fileInputStream; import java.io.file;/ * http 응답 = 상태 -Line * ((일반 헤드 | 응답 헤드 | 엔티티 헤드) crlf) crlf [메시지] rasure-phrase crlf*/public class 응답 {private static final int buffer_size = 1024; 요청 요청; 출력 스트림 출력; 공개 응답 (OutputStream 출력) {this.output = 출력; } public void setRequest (요청 요청) {this.request = request; } public void sendstaticResource ()는 ioException {byte [] bytes = new Byte [buffer_size]; fileInputStream fis = null; {// outputStream 바이트 스트림 파일에 웹 파일을 쓰기 파일 = 새 파일 (httpserver.web_root, request.geturi ()); if (file.exists ()) {fis = new FileInputStream (file); int ch = fis.read (바이트, 0, buffer_size); while (ch! = -1) {output.write (bytes, 0, ch); ch = fis.read (바이트, 0, buffer_size); }} else {// 파일을 찾지 못했습니다. string errormessage = "http/1.1 404 파일 찾기/r/n" + "content-type : text/html/r/n" + "content-length : 23/r/n" + "/r/n" + "<h1> 찾을 수 없음 </h1>"; output.write (errormessage.getBytes ()); }} catch (예외 e) {// 파일 객체 시스템을 인스턴스화 할 수없는 경우 던졌습니다. } 마침내 {if (fis! = null) fis.close (); }}} 3. 결과 테스트
기존 리소스 파일에 액세스하십시오 (프로젝트 디렉토리의 Webroot 폴더에 저장되어 있음) :
존재하지 않는 리소스 파일 액세스 :
서버 닫기 :
참조 : "Tomcat의 심층 분석"
@Author 바람과 같은 코더
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.