HTTP는 Hyper Text Transfer Protocol의 약자입니다. 이 개발은 HTTP/1.0 버전을 정의하는 RFC 1945 시리즈를 발표한 World Wide Web 컨소시엄과 IETF(Internet Engineering Task Force) 간의 협력의 결과입니다. 그 중 가장 유명한 것은 RFC 2616이다. RFC 2616은 오늘날 일반적으로 사용되는 버전인 HTTP 1.1을 정의합니다.
HTTP 프로토콜(HyperText Transfer Protocol, Hypertext Transfer Protocol)은 WWW 서버에서 로컬 브라우저로 하이퍼텍스트를 전송하는 데 사용되는 전송 프로토콜입니다. 브라우저를 더욱 효율적으로 만들고 네트워크 전송을 줄일 수 있습니다. 이는 컴퓨터가 하이퍼텍스트 문서를 정확하고 빠르게 전송하도록 보장할 뿐만 아니라 문서의 어느 부분이 전송되고 내용의 어느 부분이 먼저 표시되는지(예: 그래픽보다 텍스트) 등을 결정합니다.
HTTP는 데이터(HTML 파일, 이미지 파일, 쿼리 결과 등)를 전송하기 위한 TCP/IP 기반의 통신 프로토콜입니다.
HTTP는 요청과 응답으로 구성된 애플리케이션 계층 프로토콜이며 표준 클라이언트-서버 모델입니다.
HTTP는 상태 비저장 프로토콜입니다.
![HTTP 프로토콜에 대한 깊은 이해.jpg 업로드에 실패했습니다. 다시 시도해 주세요.]
이는 HTTP 프로토콜의 사용을 제한하며 클라이언트가 요청을 시작하지 않으면 서버가 클라이언트에 메시지를 푸시하는 것이 불가능합니다.
HTTP 프로토콜은 상태 비저장 프로토콜입니다. 이 요청과 동일한 클라이언트의 이전 요청 간에는 일치하지 않습니다.
데이터베이스의 CRUD 추가, 삭제, 수정 및 확인 작업에 대응할 수 있습니다.
CREATE: PUT
READ: GET
UPDATE: POST
DELETE: DELETE
200은 성공적인 응답을 나타내고 다음 OK는 설명입니다.
반환된 값이 200이 아니면 다음과 같은 다른 기능이 있는 경우가 많습니다.
Content-Type: text/html
Content-Type은 응답 내용을 나타내며, 여기서 text/html은 HTML 웹 페이지를 나타냅니다.
브라우저가 Sina 홈페이지의 HTML 소스 코드를 읽으면 HTML을 파싱하고 페이지를 표시한 다음 HTML의 다양한 링크를 기반으로 Sina 서버에 HTTP 요청을 보냅니다. 해당 사진, 비디오, 플래시, JavaScript 스크립트, CSS 및 기타 리소스에 연결하고 마지막으로 전체 페이지를 표시합니다.
Sina 홈페이지에 따라 HTTP 요청 프로세스를 요약해 보겠습니다.
방법: GET 또는 POST, GET만 리소스를 요청하면 POST에는 사용자 데이터가 함께 제공됩니다.
경로: /full/url/path;
도메인 이름: 호스트 헤더로 지정: 호스트: www.sina.com
및 기타 관련 헤더; POST인 경우 요청에는 사용자 데이터가 포함된 본문도 포함됩니다.
응답 유형: Content-Type 및 기타 관련 헤더에 의해 지정됩니다.
일반적으로 서버의 HTTP 응답은 콘텐츠를 전달합니다. , 응답 내용이 포함된 Body가 있습니다. 웹 페이지의 HTML 소스 코드가 Body에 있습니다.
3단계: 브라우저가 서버에서 사진과 같은 다른 리소스를 계속 요청해야 하는 경우 다른 HTTP 요청을 수행하고 1단계와 2단계를 반복합니다.
2.HTTP 형식
GET /path HTTP/1.1
Header1: Value1
Header2: Value2
Header3: Value3
각 헤더는 한 줄이고 개행 문자는 rn이거나 os.linesep
HTTP POST 요청 형식을 사용합니다.
POST /path HTTP/1.1
Header1: Value1
Header2: Value2
Header3: Value3
body 데이터가 여기에 들어갑니다...
HTTP 응답 형식:
200 OK
Header1: Value1
Header2: Value2
Header3: Value3
body 데이터가 여기에 들어갑니다...
Body의 데이터 유형은 Content-Type 헤더에 따라 결정됩니다. 웹페이지인 경우 본문은 그림의 바이너리 데이터입니다.
Content-Encoding이 있는 경우 Body 데이터가 압축됩니다. 가장 일반적인 압축 방법은 gzip입니다. 따라서 Content-Encoding: gzip이 표시되면 먼저 Body 데이터의 압축을 풀어야 실제 데이터를 얻을 수 있습니다. 압축의 목적은 Body의 크기를 줄이고 네트워크 전송 속도를 높이는 것입니다.
4웹 정적 서버
import socketimport multiprocessingimport osimport timedef serverHandler(clientSocket, clientAddr):'与请求的客户端进行交互'# 接收客户端发来的消息 recvData = clientSocket.recv(1024).decode('utf-8') print(recvData)# 服务端向客户端发消息,作为响应 responseLine = 'HTTP/1.1 200 OK' + os.linesep responseHeader = 'Server: laowang' + os.linesep responseHeader += 'Date: %s' % time.ctime() + os.linesep responseBody = '差一点一米八' sendData = (responseLine + responseHeader + os.linesep + responseBody).encode('gbk') clientSocket.send(sendData)# 关闭 clientSocket.close()def main():'程序入口'# socket对象 serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定的端口号,可以重复使用端口号#serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 绑定 serverSocket.bind(('', 8000))# 监听 serverSocket.listen()while True:# 接收 clientSocket, clientAddr = serverSocket.accept() print(clientSocket)# 开一个新的进程,执行交互 multiprocessing.Process(target=serverHandler, args=(clientSocket, clientAddr)).start()# 关闭客户端对象 clientSocket.close()if __name__ == '__main__': main()
import time,multiprocessing,socket,os,re G_PATH = './html' def serveHandler(clientSocket,clientAddr): recvData = clientSocket.recv(1024).decode('gbk') lineFirst = recvData.splitlines()[0] strFirst = re.split(r' +',lineFirst) fileName = strFirst[1] filePath = G_PATHif '/'== fileName: filePath += './index.html'else: filePath += fileNametry:file = Nonefile =open(filePath,'r',encoding='gbk') responseBody = file.read() responseLine = 'HTTP/1.1 200 OK' + os.linesep responseHeader = 'Server: ererbai' + os.linesep responseHeader += 'Date:%s' % time.ctime() + os.linesep except FileNotFoundError: responseLine = 'HTTP/1.1 404 NOT FOUND' + os.linesep responseHeader = 'Server: ererbai' + os.linesep responseHeader += 'Date:%s' % time.ctime() + os.linesep responseBody = '很抱歉,服务器中找不到你想要的内容' except Exception: responseLine = 'HTTP/1.1 500 ERROR' + os.linesep responseHeader = 'Server: ererbai' + os.linesep responseHeader += 'Date: %s' % time.ctime() + os.linesep responseBody = '服务器正在维护中,请稍后再试。'finally:if file!=None and not file.closed:file.close() senData = (responseLine + responseHeader + os.linesep + responseBody).encode('gbk') clientSocket.send(senData) clientSocket.close() def main(): serveSocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) serveSocket.bind(('',8000)) serveSocket.listen()while True: clientSocket,clientAddr = serveSocket.accept() print(clientSocket) multiprocessing.Process(target=serveHandler,args=(clientSocket,clientAddr)).start() clientSocket.close()if __name__ == '__main__': main()
학습 과정에서 문제가 발생하거나 학습 리소스를 얻고 싶다면 학습 교류 그룹에 오신 것을 환영합니다
343599877, 프론트 엔드를 함께 배우세요!
위 내용은 웹서버에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!