자바 간단 한 웹 서버 인 스 턴 스 분석 실현
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 서버 가 완성 되 었 습 니 다.
총결산
이상 은 자바 가 간단 한 웹 서버 인 스 턴 스 분석 을 실현 하 는 모든 내용 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.관심 이 있 는 친 구 는 본 사이트 의 다른 관련 주 제 를 계속 참고 할 수 있 습 니 다.부족 한 점 이 있 으 면 댓 글로 지적 해 주 십시오.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.