] [배울 파이썬 초보자 간단한 서버를 달성

어떻게 서버를 구현합니다. . .

소켓 인터페이스는 운영 체제가 시스템 호출을 제공 사실이다. 사용 소켓이 파이썬 언어에 한정되지 않고, (C 구현을 사용하는 아파치 서버가있다) 동일한 소켓 서버를 작성하는 C 또는 JAVA를 사용할 수 있으며, 모든 방법 언어는 유사한 소켓입니다
웹 서버 프레임 워크가 사전에 작성 . 크로스 프레임은 언어를 사용할 수 없습니다. 프레임 워크의 장점은 급속한 발전을 달성하기 위해, 몇 가지 세부 사항을 처리하는 것입니다,하지만 파이썬 자체의 성능에 의해 제한된다. 우리는보다 효율적으로 언어의 일부 있도록 사이트의 성공은 JAVA와 C 등의 코드로 변환됩니다 후 많은 성공적인 사이트, 신속한 개발 (예 : 트위터와 페이스 북과 같은 파이썬, 루비 또는 PHP 등) 동적 언어를 사용하는 본 서버가 하루 더 효율적으로 시간의 수백만의 얼굴 수백을 요청할 수 있습니다 그래서.
--ps : 또한 파이썬 학습의 과정에서 많은 사람들이, 거기에 아무도 좋은 튜토리얼이 없거나 포기하고 자신을 쉽게 최고의 가이드, 나는 파이썬 교환 드레스 내장 종종 있기 때문에 : 오랜 시간과 군사를하면서 생각의 흐름 ( 디지털 동음 이의어) 변환 문제를 오 해결할 내부 사람들과 많은 교류를 이해하지 못하고, 취할 수있는 새로운 파이썬 튜토리얼 프로젝트가, 찾을 수 있습니다!

TCP / IP 소켓 및
소켓은 네트워크 전송 프로토콜의 상부 인터페이스에 기초 간 통신하는 방법이다. 이러한 TCP 프로토콜 또는 UDP 프로토콜 (네트워크 전송 프로토콜의 두 가지 유형)와 같은 소켓의 많은 종류가있다. 그 중, 가장 일반적으로 사용되는 TCP 소켓. 작성하거나 소켓의 텍스트 스트림의 끝을 읽고, 다른 프로세스가 소켓의 다른 쪽 끝을 읽거나 쓸 수하는 프로세스 다소 유사 양방향 도관 (양면 인쇄 PIPE)와 TCP 소켓,보다 상세하게는, 모두를 확립 소켓 통신 프로세스가 통신 프로토콜과 함께, 두 개의 각각 상이한 시스템에 속하는 단지 네트워크 링크를 통해 수
TCP 프로토콜, 코드 효과적으로 네트워크 환경에서의 프로세스 간 통신 방법을 구현할 수 있도록하기 위해 통신하는 소정 수이다. 파이프 라인 (양면 PIPE)가 동일한 컴퓨터에서 살아남 양방향, 두 개의 프로세스 및 소켓은 네트워크 통신을위한 주소 정보를 포함해야 컴퓨터의 주소를 구별 할 필요가 없습니다.
포트 (포트) 두 컴퓨터 프로세스에 의해 사용되는 두 개의 IP 주소 : 네 개의 주소를 포함하는 소켓. 로케이션 처리를위한 IP 주소와 포트를 찾기위한 컴퓨터는 (다른 포트를 사용하여 컴퓨터에 복수의 프로세스가있을 수있다).

TCP 소켓
우리가 서버로 컴퓨터를 만들 수 있습니다. 서버는 수동적으로 우리의 포트에 연결된 다른 컴퓨터를 기다리고, 자신의 포트를 엽니 다. 고객과 같은 다른 컴퓨터가 적극적으로 서버에 소켓 연결을 사용하는 경우, 서버는 고객에게 서비스를 제공하기 시작했다. 사실, 즉 양방향 링크의 설립 양이다.

파이썬에서, 우리는 바닥에 표준 라이브러리 소켓 소켓 프로그래밍 패키지를 사용합니다.
첫째, 우리는 고정 주소 및 포트에 협의 소켓에 결합 () 메소드를 사용하여 수동 청취 포트로 청취 () 메소드를 사용하여, 서버 측이다. 고객이 접속, 서버가 사용하는 (동의)가 연결을 수락 때, 연결 () 메서드를 사용하려고 할 때 소켓 연결을 설정하기로 :

server.py
수입 소켓

# 주소
HOST = '127.0.0.1'
PORT = 8000

구성 소켓 #
S = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.bind ((숙주 PORT))
# socket.socket ()가 소켓에서 IPv4 설명하여 Socket 객체를 생성하고 (AF_INET, IP 버전 4)
# 프로토콜과 TCP (SOCK_STREAM).

수동 대기 # 3 : 큐에서 최대 연결 개수
s.listen (3)
# 받아들이고 접속 설정
) (CONN, ADDR = s.accept을
#받는 메시지
요청 conn.recv = (1,024)

인쇄 ( "요청은 '요청)
인쇄 ('으로 연결 ', ADDR)

메시지 # 보내기
답글 = '예'
"" "
3 데이터 바이트가 전송 될 수 있습니다 * socket.send 트랜스 코딩 STR 데이터의 전송과 같이 수정할 수 있습니다 수신하지 않을 경우 다음과 같습니다 ... S.sendall (요청 함수 .encode ())
"" "
conn.sendall (reply.encode ())

# 가까운 연결
conn.close ()
client.py의
수입 소켓

# 주소
HOST = '127.0.0.1'
PORT = 8000

요청 = '내 말 들려요?'

# 구성 소켓
의 = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.connect ((HOST, PORT))

"" "
3 바이트의 데이터가 전송되어야한다 * socket.send 트랜스 코딩은 전송 STR 다음과 같이 데이터가 변형 될 수있는 수신하지 않으면 ... S.sendall (request.encode ())
" ""

메시지 번호의 송신
s.sendall은 (request.encode ())
#은 메시지 수신
답글 = s.recv (1024)
: 인쇄 (회신 '회신')
# 사용 닫기 연결
) (S.CLOSE

우리는 소켓의 양쪽 끝에있는 호 RECV () 정보를 수신하는 방법은, 정보를 송신하는 발송을 () 메소드를 호출한다. 이러한 방법으로, 우리는 두 개의 프로세스 점에서 두 컴퓨터 사이의 통신에있을 수 있습니다. 통신 종료, 우리는 소켓 연결을 닫습니다 close () 메소드를 사용합니다.

TCP 소켓 기반의 HTTP 서버의
TCP 소켓 연결이 설정하여, 그것은 두 개의 원격 컴퓨터 통신 할 수 있습니다.
그러나 소켓 전송의 자유는 보안 및 호환성 문제를 많이로 이어지는, 너무 높습니다. 우리는 종종 (HTTP와 같은 프로토콜) 일부 프로토콜 응용 프로그램 계층은 소켓 사용 규칙을 지정하고, 전송되는 정보의 형식을 사용합니다.

HTTP 프로토콜을 사용 요청 - TCP 소켓 (요청 - 응답) 방식을 사용하여 응답합니다.

서버에 클라이언트 요청과 같은 텍스트를 보내고, 서버는 요청을받은 후, 응답으로 클라이언트에게 문자를 보낼 수 있습니다.

이러한 요청 - 응답 트랜잭션이 완료되면, TCP 소켓은 삭제됩니다. 다음 요청은 새로운 소켓을 생성합니다.
그는 요청과 응답이 두 텍스트 만 HTTP 프로토콜은 특정 형식의 요구 사항이 텍스트는 본질적으로 말했다.

Httpserver.py
수입 소켓

# 주소
HOST = ''
PORT = 8000

# 준비 HTTP 응답
TEXT_CONTENT = '' 'HTTP / 1.x에서 200 OK의
콘텐츠 유형 : 텍스트 / html로

<HEAD>
<TITLE> WOW </ TITLE>
</ HEAD>
<HTML>
<p>와, 파이썬 서버 </ p>
<IMG SRC = "test.jpg를"/>
</ HTML>
''

HTTP 형식에 넣어 # 읽기 사진,
F = 개방 ( 'test.jpg를', 'RB')
pic_content = '' '
HTTP / 1.x에서 200 OK의
콘텐츠 형식 : 이미지 / JPG

'' '

pic_content pic_content.bytes = () + f.read ()
f.close ()

# 구성 소켓
의 = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.bind ((HOST, PORT))

# 무한 루프 서버 영원히
동안 참 :
3 : 요청의 최대 개수 대기
s.listen (3)
CONN, ADDR s.accept = ()
요청 conn.recv = (1,024)
에있어서 = request.split ( '') 0]
SRC = request.split ( '') [1]

# GET 방식으로 거래
하는 경우 방법 == 'GET':
# ULR
경우 SRC == '/test.jpg'
내용 = pic_content
다른 : 내용 = TEXT_CONTENT

( '에 의해 연결', ADDR) 인쇄
(요청 '요청입니다') 인쇄
conn.sendall (content.bytes ())
# 닫기 연결
conn.Close ()

읽기
전송 요청에 따라 클라이언트에 두 TEXT_CONTENT 서버 정보를 와 응답 텍스트로, 하나의 pic_content.

전체 응답이 시작 행 (스타트 라인)으로 분할하고, 상기 헤더 정보 (헤드)과 세 부품의 바디 (몸체).

(200)은 인, HTTP / 1.x에서 200은 상태 (상태 코드)을 나타낸다 사용하여 표현 HTTP HTTP / 1.x에서 200 OK 실제로 세 단편 HTTP 버전 공간으로 바꿀 : 첫 번째 줄 시작 라인 사람들이 상태 코드를 읽을 규정 된 프로토콜, 서버가 정상 수신 및 처리 요청을 나타내고, OK입니다.

헤더는 몸 사이에 빈 줄이, 출발 선을 따른다. 여기 TEXT_CONTENT 헤더 정보 나 pic_content은 하나 개의 라인, HTML 텍스트의 유형을 나타내는 TEXT_CONTENT 제목 정보를 가지고 : 콘텐츠 유형 : 텍스트 / html로

정보 또는 콘텐츠 JPG 파일의 HTML 본문. (JPG 파일을, 우리가 사용하는 것으로 'RB'모드가 윈도우와의 호환성을 위해 켜집니다. 창에서, JPG 이진 (바이너리로 간주되기 때문에) UNIX 시스템의 파일, 당신은 텍스트와 바이너리 파일을 구분할 필요는 없습니다 .)

HttpClient.py
클라이언트 프로그램은, 당신은 당신의 자신을 작성할 수 있습니다. 물론, 일반적으로 클라이언트로 브라우저를 사용합니다.
클라이언트 프로그램에서 서버에 요청합니다. 요청이 때문에 응답으로 세 부분으로 나누어 져 있지만, 요청의 형식 및 응답 형식은 동일하지 수 있지만. 다음과 같은 서버에 클라이언트에서 보낸 요청은 요청입니다 :

HTTP /test.jpg는 GET / 1.x의
수용 : 텍스트 / *

시작 라인은 세 부분, 요청 방법 (요청 방법)의 첫 부분으로 분할 될 수 있고, 두 번째 부분은 URL의 HTTP 버전 번째 부분이다. 요청 방법은 GET, PUT, POST, DELETE, 할 수 있습니다 HEAD를. 가장 일반적으로 GET과 POST하는 데 사용됩니다. GET 요청은 클라이언트 리소스 서버에 의해 전송되고, POST 요청은 서버가 클라이언트로부터 수신 한 데이터를 전송한다. 우리는 페이지를 열 때, 우리는 일반적으로 GET 메소드를 사용하여, 우리는 양식을 작성하여 제출하면, 우리는 일반적으로 POST 메소드를 사용합니다. 두 번째 부분은 URL, 그것은 일반적으로 (서버 리소스에 또는 다른 자원) 리소스를 가리 킵니다. 지금처럼, 현재 포인트 test.jpg를 현재 디렉토리 서버입니다.

HTTP 프로토콜에 따라, 서버는 요청에 따라 몇 가지 작업을 수행해야합니다. 우리는 서버 프로그램에서 보았 듯이, 우리는 파이썬 프로그램은 요청 메소드를 확인하려면, 다음의 URL에 따라서 다른 응답 (TEXT_CONTENT 또는 pic_content)를 생성 할 수 있습니다. 그 후, 응답이 클라이언트로 전송됩니다.

테스트
서버로, 터미널 HTTP 서버 프로그램 위를 실행 한 다음 클라이언트로 브라우저를 엽니 다. (당신이 시간이 있다면, 당신은 위의 TCP 소켓 클라이언트 프로그램을 클라이언트 원리를 작성하는 파이썬을 사용할 수있는 것은 비슷합니다.)
브라우저의 주소 표시 줄에 : 127.0.0.1 : 8000

사용 브라우저 디버깅 F12 기능

가져 오기 /는 HTTP / 1.1
호스트 : 127.0.0.1:8000
User-- 에이전트 : 모질라 / 5.0 (X11, 우분투하며 리눅스 x86_64에, RV : 14.0) 도마뱀 / 파이어 폭스 20100101 / 14.0.1
수락 : / XHTML + XML 텍스트 / HTML 파일 응용 프로그램 파일 응용 프로그램 / XML, Q = 0.9, * / *; Q = 0.8
수락 - 언어 : EN-US, EN, Q = 0.5
수락 - 인코딩 : gzip을의 공기를 빼다
연결 : 연결 유지를

브라우저가 TEXT_CONTENT를 수신 한 후, 찾은 텍스트 text.jpg 파일의 사진을 얻기 위해 보완해야 할 필요성의 인식이 HTML 텍스트는 바로 두 번째 요청을 보낸 :

/Test.jpg HTTP GET / 1.1
호스트 : 127.0.0.1:8000
사용자 에이전트 : 모질라 / 5.0 (X11, 우분투, 리눅스 x86_64의 장, : 14.0) 게코 / 파이어 폭스 20100101 / 14.0.1
수락 : 이미지 / PNG, 이미지 / *; Q = 0.8, * / *; Q 0.5 =
수락 - 언어 : US-EN, EN을, Q 0.5 =
수락 - 인코딩 : gzip을의 공기를 빼다
연결 : 연결 유지
리퍼러 : http://127.0.0.1:8000/

요약
우리의 서버 프로그램에 1), 우리는 서버가 자신의 작업을 할 수 있도록 while 루프를 사용합니다. 사실 지식, while 루프 대신 멀티 프로세스 또는 멀티 스레드 작업의 내용을 멀티 스레딩의 사용.

2) 서버 프로그램이 완벽하지, 당신은 또한 더 복잡한 기능을 달성하기 위해 파이썬 파이썬 프로그램의 다른 기능 통화를 할 수 있습니다. 서버가 고객에게 날짜와 시간을 반환 그래서 예를 들어, 시간 서버를 확인합니다. 또한 전체 LAMP 서버를 달성하기 위해 데이터베이스에 내장 된 파이썬이 사용할 수 있습니다.

3) 소켓 패킷 상대적으로 패키지를 기본입니다. 파이썬 표준 라이브러리뿐만 아니라 SocketServer, SimpleHTTPServer, CGIHTTPServer, CGI와 같은 높은 수준의 패키지. 이러한 모든 패키지는 우리가 쉽게 소켓을 사용 돕고있다. 이 패키지는 쉽게 이해할 수있다. 이러한 높은 수준의 패키지로, 당신은 상당히 성숙 서버를 작성할 수 있습니다.

내가 프레임 워크를 사용하기로 결정 그래서 4) 모든 문제 후, 나는, 프레임 워크가 매우 편리 것으로 나타났다. 물론, 당신은 열정 프레임 워크 개발에 참여할 수 있습니다.
-ps : 또한 파이썬 학습의 과정에서 많은 사람들이, 거기에 아무도 좋은 튜토리얼이 없거나 포기하고 자신을 쉽게 최고의 가이드, 나는 파이썬 교환 드레스 내장 종종 있기 때문에 : 오랜 시간과 군사를하면서 생각의 흐름 ( 디지털 동음 이의어) 변환 문제를 오 해결할 내부 사람들과 많은 교류를 이해하지 못하고, 취할 수있는 새로운 파이썬 튜토리얼 프로젝트가, 찾을 수 있습니다!

자신의 아이디어와 네트워크에서이 문서의 텍스트 및 이미지,뿐만 아니라 상업적 목적, 저자에 소유하여, 교환 내용, 질문이있는 경우, 치료를 위해 문의하시기 바랍니다.

추천

출처www.cnblogs.com/chengxuyuanaa/p/12150491.html