웹 서버와 클라이언트 간의 통신은 HTTP 프로토콜을 사용하는 것으로 잘 알려져 있습니다. HTTP는 클라이언트 및 서버 요청 및 응답 (TCP)의 표준입니다. HTTP 프로토콜은 TCP 프로토콜을 기반으로하기 때문에 Java의 소켓을 사용 하여이 간단한 웹 서버를 완료합니다. 보다 자세한 HTTP 정보를 보려면 관련 정보를 참조하여 이에 대해 알아볼 수 있습니다.
서버를 작성하기 전에 브라우저와 서버 간의 통신 규칙을 살펴 보겠습니다.
우선, 서버를 사용하여 서버를 시뮬레이션하고 브라우저를 통해 서버에 액세스하고 브라우저에서 요청한 컨텐츠를 볼 수 있습니다.
import java.io.bufferedWriter; import java.io.inputStream; import java.io.outputstreamwriter; import java.net.inetAddress; import java.net.inetSocketAddress; import java.net.serversocket; import java.net.socket; import org.junit.test;/* http protocor; jianggujin */public class hqhttpprotocoltest {@test public void server ()는 예외 {serversocket serversocket = new serversocket (80); Socket Socket = serversocket.accept (); inputStream 스트림 = socket.getInputStream (); int r = -1; while ((r = stream.read ())! = -1) {System.out.print ((char) r); }}}Junit으로 실행하고 브라우저를 통해 액세스 할 수 있습니다 : http://127.0.0.1 , 콘솔의 브라우저의 요청 컨텐츠 출력이 다음과 같습니다.
get/http/1.1host : 127.0.0.1connection : Keep-AliveAccep : Text/Html, Application/XHTML+XML, Application/XML; Q = 0.9, 이미지/웹p,*/*; Q = 0.8user-Agent : Muszilla/5.0 (Windows nt 5.1) Applewebkit/537.36 (KhteCho). Chrome/31.0.1650.63 Safari/537.36-Accept-Encoding : Gzip, deflate, sdchaccept-language : Zh-CN, ZH; Q = 0.8
요청 컨텐츠를 더 잘 분석하기 위해 HTML 페이지를 작성하여 일부 데이터를 제출하고 요청 컨텐츠를 다시 볼 수 있습니다.
<! docType html> <html> <head> <meta charset = "utf-8"> <title> test </title> </head> <body> <form method = "post"action = "http://127.0.0.1?test=123"> input type = "text"name "/> <input 타입 = "제출"/> </form> </body> </html>
입력 상자에 Bob을 입력하고 버튼을 클릭하여 제출 한 다음 콘솔 출력을 관찰하십시오.
Post/? Test = 123 HTTP/1.1Host : 127.0.0.1 연결 : Keep-AliveContent-Length : 8Cache-Control : Max-age = 0ACCEPT : TEXT/HTML, APPLICATE/XHTML+XML, Application/XML; Q = 0.9, Image/Webp,*/*; NT 5.1) AppleWebkit/537.36 (KHTML, Gecko Like Gecko) Chrome/31.0.1650.63 Safari/537.36Content-Type : Application/X-WWW-urlencodedAccept-encoding : gzip, deflate, sdchaccept-language : zh-cn;
이 요청의 내용을 분석하겠습니다.
첫 번째 줄 : 중간의 공간으로 분리 된 세 부분으로 구성되고 첫 번째 부분은 요청 메소드 (get, post), 두 번째 부분은 요청 경로 및 쿼리 매개 변수이며, 세 번째 부분은 HTTP 프로토콜 버전 (http/1.1)입니다.
라인 2에서 10 행 : 요청 헤더의 헤더 정보, 요청 헤더의 이름 및 값이 전달됩니다. 제 11 줄 분리 : 빈 줄 12 줄 : 제출 된 양식 컨텐츠, 다음 결론을 얻을 수 있습니다. 요청 정보의 첫 번째 동작은 요청 방법, 요청 경로, 쿼리 매개 변수 및 HTTP 프로토콜 버전입니다. /r /n 라인 브레이크 후, 요청 헤더 정보가 즉시 /r /n 라인 브레이크가 이어지고, 요청 헤더 정보가 요청 헤더 정보가 완료된 후에는 빈 줄이 뒤 따르고, 요청 데이터 뒤에 즉시 빈 줄이 뒤 따릅니다. 이것은 시뮬레이션되었다는 점에 유의해야합니다. 복잡한 파일 제출 등의 경우 여기에서 설명하지 않으며 요청 내용 형식은 약간 다릅니다.
이 시점에서 우리는 이미 클라이언트가 요청한 콘텐츠를 알고 있습니다. 요청을 수신 한 후 서버의 응답 데이터 형식을 살펴 보겠습니다. 우리는 다음과 같이 HTML 페이지의 컨텐츠를 테스트하고 편집하기위한 새로운 웹 프로젝트를 만듭니다.
<! doctype html> <html> <head> <meta charset = "utf-8"> <title> test </title> </head> <bod> 이것은 테스트 페이지입니다. </body> </html>
서버를 시작한 다음 클라이언트 테스트 코드를 작성하여 서버 리턴 데이터를 얻습니다.
import java.io.bufferedWriter; import java.io.inputStream; import java.io.outputstreamwriter; import java.net.serversocket; import java.net.socket; import org.junit.test;/** * http protocol test * * @author jangggujin */public classh hqhhttpot exhhtpropt ehtpprot exhhtprot ehtpprot exhhtor Server ()는 예외를 {serversocket serversocket = new Serversocket (80); Socket Socket = serversocket.accept (); inputStream 스트림 = socket.getInputStream (); // bufferedInputStream inputStream = new bufferedInputStream (stream); int r = -1; while ((r = stream.read ())! = -1) {System.out.print ((char) r); }} @test public void client ()는 예외 {소켓 소켓 = 새로운 소켓 ( "127.0.0.1", 80); BufferedWriter Writer = New BufferedWriter (New OutputStreamWriter (socket.getOutputStream ())); Writer.write ( "get /servlet/test.html http/1.1/r/n"); Writer.write ( "호스트 : 127.0.0.1/r/n"); Writer.write ( "연결 : Keep-alive/r/n"); writer.write ( "수락 : text/html, application/xhtml+xml, application/xml; q = 0.9, image/webp,*/*; q = 0.8/r/n"); Writer.Write ( "사용자 에이전트 : Mozilla/5.0 (Windows NT 5.1) AppleWebkit/537.36 (Gecko Like Gecko) Chrome/31.0.1650.63 Safari/537.36/r/n"); writer.write ( "허용 인코딩 : gzip, deflate, sdch/r/n"); Writer.write ( "허용 : Zh-CN, ZH; Q = 0.8/r/n"); Writer.write ( "/r/n"); Writer.flush (); inputStream 스트림 = socket.getInputStream (); int r = -1; while ((r = stream.read ())! = -1) {System.out.print ((char) r); }}}서버를 얻기 위해 프로그램을 실행하여 다음 컨텐츠를 반환합니다.
HTTP/1.1 200 OKSERVER : Apache-Coyote/1.1accept-ranges : 바이트 세트 : W/"129-1456125361109"최후의 수정 : MON, 2016 년 2 월 22 일 07:16:01 GMTContent-Type : Text/HtmlContent-length : 129date : Mon, 22 Feb 2016 08:08:32. gmt <! doctype html> <html> <html> <head> <head> <meta charset = "utf-8"> <title> 테스트 </title> </head> <body> 이것은 테스트 페이지입니다. </body> </html>
마찬가지로이 반환 메시지를 분석하겠습니다.
첫 번째 줄은 중간의 공간으로 분리 된 세 부분으로 구성되며, 첫 번째 부분은 HTTP 프로토콜 버전 (http/1.1), 두 번째 부분은 응답 상태 코드이며 세 번째 부분은 일곱 번째 줄에 대한 두 번째 줄의 응답 상태 설명입니다. 응답 헤더 이름과 값 사이의 응답 정보는 전달됩니다. 첫 번째는 요청 정보 HTTP 프로토콜 버전, 응답 상태 코드 및 응답 상태 설명 및 응답 헤더 정보에 이어 /r /n 라인 브레이크가 이어지고 응답 헤더 정보는 /r /n 라인 브레이크가 전달되며 응답 헤더 정보가 완료된 후에는 빈 줄에 따라 응답 데이터가 즉시 응답 데이터가 뒤 따릅니다. 이 응답 외에도 실제로 여기에서 논의되지 않은 Chunk와 같은 다른 해당 방법이 있으며 관련 정보를 확인할 수 있습니다.
지금까지 클라이언트의 요청 컨텐츠 형식과 서버의 해당 콘텐츠 형식을 분석했습니다. 이 기사는 여기서 끝납니다. 모든 사람의 학습에 도움이되기를 바랍니다.