Content-Type: text/html
Content-Type은 응답 내용을 나타내며, 여기서 text/html은 HTML 웹 페이지를 나타냅니다.
3. 브라우저 파싱 프로세스
브라우저가 Sina 홈페이지의 HTML 소스 코드를 읽으면 HTML을 파싱하고 페이지를 표시한 다음 HTML의 다양한 링크를 기반으로 Sina 서버에 HTTP 요청을 보냅니다. 해당 사진, 비디오, 플래시, JavaScript 스크립트, CSS 및 기타 리소스에 연결하고 마지막으로 전체 페이지를 표시합니다.
3. 요약
1. HTTP 요청 프로세스
Sina 홈페이지에 따라 HTTP 요청 프로세스를 요약해 보겠습니다.
1단계: 브라우저는 먼저 서버에 HTTP 요청을 보냅니다.
방법: GET 또는 POST, GET만 리소스를 요청하면 POST에는 사용자 데이터가 함께 제공됩니다.
경로: /full/url/path;
도메인 이름: 호스트 헤더로 지정: 호스트: www.sina.com
및 기타 관련 헤더; POST인 경우 요청에는 사용자 데이터가 포함된 본문도 포함됩니다.
2단계: 서버가 브라우저에 HTTP 응답을 반환합니다. 응답에는 다음이 포함됩니다.
응답 코드: 200은 성공을 나타내고, 3xx는 리디렉션을 나타내고, 4xx는 나타냅니다. 클라이언트가 보낸 요청에 오류가 있음을 나타냅니다.
응답 유형: Content-Type 및 기타 관련 헤더에 의해 지정됩니다.
일반적으로 서버의 HTTP 응답은 콘텐츠를 전달합니다. , 응답 내용이 포함된 Body가 있습니다. 웹 페이지의 HTML 소스 코드가 Body에 있습니다.
3단계: 브라우저가 서버에서 사진과 같은 다른 리소스를 계속 요청해야 하는 경우 다른 HTTP 요청을 수행하고 1단계와 2단계를 반복합니다.
웹에서 채택한 HTTP 프로토콜은 매우 간단한 요청-응답 모델을 채택하여 개발을 크게 단순화합니다. 페이지를 작성할 때 HTTP 요청에 HTML만 보내면 되며 사진, 동영상 등을 첨부하는 방법을 고려할 필요가 없습니다. 브라우저가 사진과 동영상을 요청해야 하면 또 다른 HTTP 요청을 보냅니다. 따라서 HTTP 요청은 하나의 리소스만 처리합니다(TCP 프로토콜에서는 짧은 연결로 이해될 수 있습니다. 각 링크는 하나의 리소스만 얻습니다. 더 필요한 경우 여러 링크를 설정해야 합니다)
HTTP 프로토콜도 강력합니다. 브라우저가 홈 페이지를 요청하지만 Sina는 HTML로 다른 서버의 리소스를 연결할 수 있습니다. - orient/strip%7CimageView2/2/w/1240)을 통해 요청압력을 여러 서버로 분산시키며, 하나의 사이트가 다른 사이트로 연결될 수 있고, 수많은 사이트가 서로 연결되어 월드와이드웹(World Wide Web)을 이루게 된다. WWW로.
2.HTTP 형식
클라이언트 요청 정보
서버 응답 메시지
각 HTTP 요청과 응답은 헤더와 본문의 두 부분으로 구성됩니다. 선택 사항입니다. HTTP 프로토콜은 텍스트 프로토콜이므로 형식도 매우 간단합니다. - HTTP GET 요청 형식:
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 데이터가 여기에 들어갑니다...
두 개의 연속된 rn이 발견되면 Header 부분이 끝나고 이후의 모든 데이터는 Body입니다. HTTP 응답 형식:
200 OK
Header1: Value1
Header2: Value2
Header3: Value3
body 데이터가 여기에 들어갑니다...
HTTP 응답에 body가 포함되어 있으면 rnrn으로 구분됩니다. Body의 데이터 유형은 Content-Type 헤더에 따라 결정됩니다. 웹페이지인 경우 본문은 그림의 바이너리 데이터입니다.
Content-Encoding이 있는 경우 Body 데이터가 압축됩니다. 가장 일반적인 압축 방법은 gzip입니다. 따라서 Content-Encoding: gzip이 표시되면 먼저 Body 데이터의 압축을 풀어야 실제 데이터를 얻을 수 있습니다. 압축의 목적은 Body의 크기를 줄이고 네트워크 전송 속도를 높이는 것입니다.
4웹 정적 서버
1. 고정 페이지 표시
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()
클라이언트 브라우저 페이지
2. 필수 페이지 표시
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()
클라이언트 브라우저 홈페이지
클라이언트 브라우저 biye.html 페이지
학습 과정에서 문제가 발생하거나 학습 리소스를 얻고 싶다면 학습 교류 그룹에 오신 것을 환영합니다
343599877, 프론트 엔드를 함께 배우세요!