検索
ホームページバックエンド開発Python チュートリアルPython の SimpleHTTPServer ソース コードと組み合わせてソケット通信を解析します

ソケットとは
コンピューターは、その名前が示すように、計算に使用されます。そのため、計算が必要な条件を入力し、計算結果を出力する入出力も必要となります。これらの入出力はI/O(入出力)として抽象化できます。

Unix コンピューターは、ファイルの抽象化を通じて IO を処理します。入出力、つまり異なるコンピュータープロセス間の通信もあります。したがって、この通信もファイルの抽象ファイル記述子を通じて実行されます。

同じコンピューター上で、プロセスはこのように通信できます。異なるコンピューターの場合はどうなるでしょうか?ネットワーク上のさまざまなコンピュータも通信できるため、ネットワーク ソケットを使用する必要があります。ソケットは、異なるコンピューター間の通信を抽象化したものです。彼は、TCP/IP プロトコルのアプリケーション層とトランスポート層の間の抽象化に取り組んでいます。以下に示すように:

2016627161931394.jpg (542×476)

サーバー通信
ソケットは、異なるコンピュータ間の通信、つまりネットワーク通信を保証します。 Web サイトの場合、通信モデルはクライアント/サーバー通信です。両端はソケット オブジェクトを確立し、ソケット オブジェクトを通じてデータを送信します。通常、サーバーはワイヤレス ループ内でクライアントの接続を待機しています。

2016627162000798.jpg (478×491)

ソケット通信例
ソケットインターフェースはオペレーティングシステムによって提供され、オペレーティングシステムを呼び出すためのインターフェースです。もちろん、高級言語は通常、便利な関数インターフェイスをカプセル化します。これは、Python コードを使用した単純なソケット サーバーの例です。

サーバー.py

リーリー
client.py

リーリー

TCP スリーウェイ ハンドシェイク
Python コードでソケットを記述するのは簡単です。伝説の TCP スリーウェイ ハンドシェイクはどのように具体化されるのでしょうか?スリーウェイハンドシェイクとは何ですか?

最初のハンドシェイク: まず、クライアントは syn を送信して接続をリクエストします。 2 回目のハンドシェイク: サーバーは受信後に確認し、同期応答を送信します

3 番目のステップ: サーバーから応答を受信した後、クライアントは接続を確立するためにサーバーに確認を送信します。
次の比喩を使用してください

C: 予約を取りますか?

S:

について

C: わかりました

デート

これにより、TCP 接続セッションが確立されます。切断したい場合の一般的なプロセスは次のとおりです:



2016627162110796.png (416×209)上の写真は、スリーウェイ ハンドシェイク ソケットの具体的なプロセスも明確に示しています。

connect を呼び出した後、クライアント ソケット オブジェクトはブロックされます。このプロセスは syn を送信します。
  • サーバーソケットオブジェクトは、accept 関数を呼び出した後、クライアントから syn が送信されるまでブロックし、その後 syn 応答と ack 応答を送信します
  • クライアント ソケット オブジェクトは、サーバーから送信された応答を受信した後、サーバーに ack を送信し、connect 呼び出しを返して接続を確立します。
  • サーバーソケットオブジェクトはクライアントの最後のハンドシェイクを受け入れ、ackを確認し、accept関数を返し、接続を確立します。
  • この時点で、クライアントとサーバー間のソケット通信接続が確立され、残りは両端の接続オブジェクトがデータを送受信してネットワーク通信を完了します。


シンプルHTTPサーバー

単純な HTTP サービスを構築するには、HTTPServer を継承する必要があり、リクエストハンドラーも BaseHTTPRequestHandler を継承する必要があります。 Python は SimpleHTTPServer という例を実装しています。したがって、SimpleHTTPServer を分析して、以前のクラスのいくつかを使用して http サービスを構築する方法を確認します。
Python のシンプルさと優雅さを示すために、Python では 1 行のコードでサーバーを起動できる例がよく挙げられました。

リーリー

ここでの SimpleHTTPServer は HTTPServer を実装するモジュールです。

SimpleHTTPServer は、BaseHTTPServer モジュールのテスト メソッドをエントリ ポイントとして使用します。

リーリー

テスト メソッドは 2 つのことを行います。1 つ目は、HTTPServer を使用してリスニング アドレスと requestClass パラメーターを受け取り、インスタンス オブジェクトを作成し、server_forever メソッドを呼び出してサービスを開始することです。

1.SimpleHTTPRequestHandler

前の分析によると、httpserver サービスを使用するには、BaseHTTPRequestHandler を継続し、イントロスペクション メソッドを提供するだけで済みます。
リーリー

do_GETとdo_HEADはそれぞれhttp getリクエストとheadリクエストの処理を実装します。 send_head メソッドを呼び出します:

リーリー

send_head メソッドは、uri のパス分析を通じて顧客が要求したネットワーク パスを取得します。 head の MIME メタ情報を構築してクライアントに送信し、パスを開くためのファイル ハンドルを返します。

2.ファイルをコピー

do_GET の次のステップは、顧客が要求したパスのファイル データを、copyfile メソッドを通じてバッファされた書き込み可能なファイルに書き込み、クライアントに送信することです。

3.list_directory
SimpleHTTPServer模块还提供了list_directory方法,用于响应path是一个目录,而不是文件的情况。

def list_directory(self, path):
  try:
    list = os.listdir(path)
  except os.error:
    self.send_error(404, "No permission to list directory")
    return None
  list.sort(key=lambda a: a.lower())
  f = StringIO()
  displaypath = cgi.escape(urllib.unquote(self.path))
  f.write('<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">')
  f.write("<html>\n<title>Directory listing for %s</title>\n" % displaypath)
  f.write("<body>\n<h2 id="Directory-listing-for-s">Directory listing for %s</h2>\n" % displaypath)
  f.write("<hr>\n<ul>\n")
  for name in list:
    fullname = os.path.join(path, name)
    displayname = linkname = name
    # Append / for directories or @ for symbolic links
    if os.path.isdir(fullname):
      displayname = name + "/"
      linkname = name + "/"
    if os.path.islink(fullname):
      displayname = name + "@"
      # Note: a link to a directory displays with @ and links with /
    f.write('<li><a href="%s">%s</a>\n'
        % (urllib.quote(linkname), cgi.escape(displayname)))
  f.write("</ul>\n<hr>\n</body>\n</html>\n")
  length = f.tell()
  f.seek(0)
  self.send_response(200)
  encoding = sys.getfilesystemencoding()
  self.send_header("Content-type", "text/html; charset=%s" % encoding)
  self.send_header("Content-Length", str(length))
  self.end_headers()
  return f

由此可见,处理客户端的请求,只需要使用 send_reponse, send_header 和 end_headers ,就能向客户端发送reponse。

4.自定义http服务
定义一个CustomHTTPRequestHadnler继承自BaseHTTPRequestHandler。在其内实现do_GET 方法来处理get请求。

然后再定义一个CustomHTTPServer继承自HTTPServer,它接受CustomHTTPRequestHadnler作为自己的handler。简单的代码如下:

# -*- coding: utf-8 -*-

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer


class CustomHTTPRequestHandler(BaseHTTPRequestHandler):
  def do_GET(self):
    self.send_response(200)
    self.send_header('Content-type', 'text/html')
    self.end_headers()
    self.wfile.write("hello world\r\n")


class CustomHTTPServer(HTTPServer):
  def __init__(self, host, port):
    HTTPServer.__init__(self, (host, port), CustomHTTPRequestHandler)


def main():
  server = CustomHTTPServer('127.0.0.1', 8000)
  server.serve_forever()


if __name__ == '__main__':
  main()

使用curl访问可以得到

&#10140; ~ curl http://127.0.0.1:8000
hello world
&#10140; ~

控制台会打出访问的log。

127.0.0.1 - - [01/Jun/2015 11:42:33] "GET / HTTP/1.1" 200 -

从socket的建立,select的IO模式,再到Server和Handler的组合构建服务。我们已经熟悉了python的基本网络编程。python的web开发中,更多是使用WSGI协议。实现该协议的还有 uWSGI和gunicorn等库。相比那些库,python内部提供了一个wsgiref模块,实现了一个简单wsgi服务--simple_server。

接下来将会通过分析simple_server,更好的掌握WSGI协议。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Pythonと時間:勉強時間を最大限に活用するPythonと時間:勉強時間を最大限に活用するApr 14, 2025 am 12:02 AM

限られた時間でPythonの学習効率を最大化するには、PythonのDateTime、時間、およびスケジュールモジュールを使用できます。 1. DateTimeモジュールは、学習時間を記録および計画するために使用されます。 2。時間モジュールは、勉強と休息の時間を設定するのに役立ちます。 3.スケジュールモジュールは、毎週の学習タスクを自動的に配置します。

Python:ゲーム、GUIなどPython:ゲーム、GUIなどApr 13, 2025 am 12:14 AM

PythonはゲームとGUI開発に優れています。 1)ゲーム開発は、2Dゲームの作成に適した図面、オーディオ、その他の機能を提供し、Pygameを使用します。 2)GUI開発は、TKINTERまたはPYQTを選択できます。 TKINTERはシンプルで使いやすく、PYQTは豊富な機能を備えており、専門能力開発に適しています。

Python vs. C:比較されたアプリケーションとユースケースPython vs. C:比較されたアプリケーションとユースケースApr 12, 2025 am 12:01 AM

Pythonは、データサイエンス、Web開発、自動化タスクに適していますが、Cはシステムプログラミング、ゲーム開発、組み込みシステムに適しています。 Pythonは、そのシンプルさと強力なエコシステムで知られていますが、Cは高性能および基礎となる制御機能で知られています。

2時間のPython計画:現実的なアプローチ2時間のPython計画:現実的なアプローチApr 11, 2025 am 12:04 AM

2時間以内にPythonの基本的なプログラミングの概念とスキルを学ぶことができます。 1.変数とデータ型、2。マスターコントロールフロー(条件付きステートメントとループ)、3。機能の定義と使用を理解する4。

Python:主要なアプリケーションの調査Python:主要なアプリケーションの調査Apr 10, 2025 am 09:41 AM

Pythonは、Web開発、データサイエンス、機械学習、自動化、スクリプトの分野で広く使用されています。 1)Web開発では、DjangoおよびFlask Frameworksが開発プロセスを簡素化します。 2)データサイエンスと機械学習の分野では、Numpy、Pandas、Scikit-Learn、Tensorflowライブラリが強力なサポートを提供します。 3)自動化とスクリプトの観点から、Pythonは自動テストやシステム管理などのタスクに適しています。

2時間でどのくらいのPythonを学ぶことができますか?2時間でどのくらいのPythonを学ぶことができますか?Apr 09, 2025 pm 04:33 PM

2時間以内にPythonの基本を学ぶことができます。 1。変数とデータ型を学習します。2。ステートメントやループの場合などのマスター制御構造、3。関数の定義と使用を理解します。これらは、簡単なPythonプログラムの作成を開始するのに役立ちます。

プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は?プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は?Apr 02, 2025 am 07:18 AM

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか?中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか?Apr 02, 2025 am 07:15 AM

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール