Python은 간단한 HttpServer 서버를 구현합니다.

巴扎黑
풀어 주다: 2017-09-26 10:35:07
원래의
3158명이 탐색했습니다.

이 글에서는 Python으로 구현한 간단한 HttpServer 서버 예제를 주로 소개합니다. 편집자도 꽤 괜찮다고 생각해서 지금 공유하고 참고용으로 올려드리겠습니다. 편집기를 따라 살펴보겠습니다

Tomcat과 유사한 간단한 서버를 작성하려면 먼저 다음 사항을 이해해야 합니다.

1 클라이언트와 서버의 역할과 기능

역할 A는 역할에서 데이터를 요청합니다. B. 이때 A는 클라이언트, B는 서버로 간주할 수 있다. 클라이언트의 주요 책임은 요청을 보내고 서버가 보낸 요청에 따라 서버가 반환한 요청 정보를 받는 것입니다. 반면 서버의 주요 책임은 요청을 받고 요청 데이터를 반환하는 것입니다.

2. 브라우저란 무엇이며 어떻게 작동하나요

우리는 흔히 B/S, C/S 아키텍처라고 하는데, B/S는 브라우저/서버, C/S는 클라이언트/서버를 의미합니다. 실제로 B/S 아키텍처는 브라우저에 표시되는 것이 B/S 아키텍처인 만큼, 브라우저에 표시되는 것이 C/S 아키텍처가 아닌 브라우저에 적용되는 프로그램입니다. 일반적인 리그 오브 레전드 게임. 그러나 본질적으로 브라우저는 특별한 클라이언트이기 때문에 C/S 아키텍처만 있습니다.

브라우저의 특별한 점은 다음 세 가지 엔진이 있다는 것입니다.

  • DOM 구문 분석 엔진: 즉, 브라우저는 HTML을 구문 분석할 수 있습니다.

  • 스타일 구문 분석 엔진: 즉, 브라우저는 구문 분석할 수 있습니다. CSS

  • 스크립트 구문 분석 엔진: 즉, 브라우저는 JAVASCRIPT

3.Socket

위에서 언급한 클라이언트와 서버 사이의 연결 및 데이터 전송 방법, 이것이 바로 Socket입니다. 프로그래밍 언어 모두 소켓 프로그래밍을 갖고 있으며, 소켓의 기능은 네트워크 통신 기능을 제공하는 것입니다

4. HTTP 프로토콜과 HTTP와 TCP/TP의 차이점

클라이언트와 서버는 네트워크 통신 기능을 구현합니다. 소켓이며 데이터 전송을 실현할 수 있습니다. 프로토콜은 데이터 전송을 규제합니다. 즉, 클라이언트와 서버 간에 전송되는 데이터는 특정 사양 및 표준에 따라 전송되어야 하며 맹목적으로 전송될 수 없습니다.

TCP/IP(전송 제어 프로토콜/인터넷 프로토콜): 전송 제어 프로토콜/인터넷 프로토콜

HTTP(하이퍼텍스트 전송 프로토콜): 하이퍼텍스트 전송 프로토콜.

TCP/TP의 차이점:

생생하게 비유하자면 TCP/TP는 도로, HTTP는 도로 위의 자동차이므로 HTTP는 TCP/TP를 기반으로 해야 합니다.

HTTP는 주로 웹 프로그램에서 사용됩니다. 원래 HTML 페이지를 게시하고 수신하는 방법을 제공하기 위해 설계되었습니다. 이는 매우 추상적이고 이해하기 어려울 수 있습니다. 특히, 웹사이트를 방문할 때 이 웹사이트에 기반한 콘텐츠(예: html, css, JavaScript)만 가져오면 됩니다. 그러나 우리는 브라우저에서 받은 리소스 패키지를 가져왔고(Fiddler 도구를 사용할 수 있음) 웹 페이지에 필요한 엔터티 콘텐츠 외에도 다음 정보도 있음을 발견했습니다.

HTTP/1.1 200 OK
캐시 -컨트롤: private
콘텐츠 유형: text /plain; charset=utf-8
콘텐츠 인코딩: gzip
Vary: Accept-Encoding
서버: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X -Powered-By: ASP.NET
날짜: 2017년 1월 24일 화요일 03:25:23 GMT
Connection: close
Content-Length: 661

http 프로토콜 사양입니다. 예를 들어 Content-Type은 다음을 참조합니다. 전송 중 파일 형식을 지정하고 Content-Encoding은 인코딩 형식을 지정합니다. 위에 나온 것 외에도 여러 가지가 있는데 여기서는 이 매개변수의 의미를 하나씩 소개하지 않겠습니다

5. URL

URL(Uniform Resource Locator)의 의미는 우리가 흔히 URL이라고 부르자. URL 분석 그를 설명하세요: http://198.2.17.25:8080/webapp/index.html

이것은 IP 198.2.17.25

을 가진 서버의 디렉토리에서 webapp의 index.html을 찾는 것을 의미합니다. 우리가 자주 보는 URL은 http://goodcandle.cnblogs.com/archive/2005/12/10/294652.aspx

사실 위와 같지만 도메인 이름 확인이 있습니다. 여기서 goodcandle.cnblogs.com을 해당 IP 주소로 해석할 수 있습니다

위의 5가지 사항을 파악한 후 코드 작성을 시작하세요

webServer.py


import socket
import sys
import getFileContent
#声明一个将要绑定的IP和端口,这里是用本地地址
server_address = ('localhost', 8080)
class WebServer():
  def run(self):
    print >>sys.stderr, 'starting up on %s port %s' % server_address
    #实例化一个Socket
    sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #绑定IP和端口
    sock.bind(server_address)
    #设置监听
    sock.listen(1)
    #这里首先给个死循环,其实这里是需要多线程的,再后续版本将会实现
    while True:
      #接受客户端的请求并得到请求信息和请求的端口信息
      connection, client_address = sock.accept()
      print >>sys.stderr, 'waiting for a connection'
      try:
        #获取请求信息
        data = connection.recv(1024)
        if data:
          #发送请求信息
          connection.sendall(getFileContent.getHtmlFile(data))
      finally:
        connection.close()

if __name__ == '__main__':
  server=WebServer()
  server.run()
로그인 후 복사

webServer.py는 매우 명확하고 간결합니다.connection.sendall()The 서버는 브라우저에 정보를 반환하지만 전송되는 데이터는 HTTP 프로토콜 사양을 따라야 합니다
getFileContent.py는 전송된 데이터에 대한 HTTP 프로토콜 사양을 처리합니다


import sys
import os

#得到要发送的数据信息
def getHtmlFile(data):
  msgSendtoClient=""
  requestType=data[0:data.find("/")].rstrip()
  #判断是GET请求还是POST请求
  if requestType=="GET":
    msgSendtoClient=responseGetRequest(data,msgSendtoClient)
  if requestType=="POST":
    msgSendtoClient=responsePostRequest(data,msgSendtoClient)
  return msgSendtoClient

#打开文件,这里不直接写,二是去取要发送的文件再写
def getFile(msgSendtoClient,file):
    for line in file:
     msgSendtoClient+=line
    return msgSendtoClient

#筛选出请求的一个方法
def getMidStr(data,startStr,endStr):
  startIndex = data.index(startStr)
  if startIndex>=0:
    startIndex += len(startStr)
    endIndex = data.index(endStr)
    return data[startIndex:endIndex]

#获取要发送数据的大小,根据HTTP协议规范,要提前指定发送的实体内容的大小
def getFileSize(fileobject):
  fileobject.seek(0,2)
  size = fileobject.tell()
  return size

#设置编码格式和文件类型
def setParaAndContext(msgSendtoClient,type,file,openFileType):
  msgSendtoClient+="Content-Type: "+type+";charset=utf-8"
  msgSendtoClient+="Content-Length: "+str(getFileSize(open(file,"r")))+"\n"+"\n"
  htmlFile=open(file,openFileType)
  msgSendtoClient=getFile(msgSendtoClient,htmlFile)
  return msgSendtoClient

#GET请求的返回数据
def responseGetRequest(data,msgSendtoClient):
  return responseRequest(getMidStr(data,'GET /','HTTP/1.1'),msgSendtoClient)

#POST请求的返回数据
def responsePostRequest(data,msgSendtoClient):
  return responseRequest(getMidStr(data,'POST /','HTTP/1.1'),msgSendtoClient)

#请求返回数据
def responseRequest(getRequestPath,msgSendtoClient):
  headFile=open("head.txt","r")
  msgSendtoClient=getFile(msgSendtoClient,headFile)
  if getRequestPath==" ":
    msgSendtoClient=setParaAndContext(msgSendtoClient,"text/html","index.html","r")
  else:
    rootPath=getRequestPath
    if os.path.exists(rootPath) and os.path.isfile(rootPath):
      if ".html" in rootPath:
        msgSendtoClient=setParaAndContext(msgSendtoClient,"text/html",rootPath,"r")
      if ".css" in rootPath:
        msgSendtoClient=setParaAndContext(msgSendtoClient,"text/css",rootPath,"r")
      if ".js" in rootPath:
        msgSendtoClient=setParaAndContext(msgSendtoClient,"application/x-javascript",rootPath,"r")
      if ".gif" in rootPath:
        msgSendtoClient=setParaAndContext(msgSendtoClient,"image/gif",rootPath,"rb")
      if ".doc" in rootPath:
        msgSendtoClient=setParaAndContext(msgSendtoClient,"application/msword",rootPath,"rb")
      if ".mp4" in rootPath:
        msgSendtoClient=setParaAndContext(msgSendtoClient,"video/mpeg4",rootPath,"rb")
    else:
      msgSendtoClient=setParaAndContext(msgSendtoClient,"application/x-javascript","file.js","r")
  return msgSendtoClient
로그인 후 복사

위 내용은 Python은 간단한 HttpServer 서버를 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿