ソケットを使用して Python でインターネット サーバーをセットアップする
01/10ソケットの紹介
ネットワーク クライアントのチュートリアルを補完するものとして、このチュートリアルでは、単純な Web サーバーを に実装する方法を示します。 パイソン .確かに、これは Apache や Zope の代わりにはなりません。 BaseHTTPServer などのモジュールを使用して、Python で Web サービスを実装するためのより堅牢な方法もあります。このサーバーは、socket モジュールのみを使用します。
socket モジュールがほとんどの Python Web サービス モジュールのバックボーンであることを思い出してください。単純なネットワーク クライアントと同様に、それを使用してサーバーを構築すると、Python での Web サービスの基本が透過的に示されます。 BaseHTTPServer 自体が socket モジュールをインポートして、サーバーに影響を与えます。
02/10サーバーの実行
おさらいすると、すべてのネットワーク トランザクションはクライアントとサーバーの間で発生します。ほとんどのプロトコルでは、クライアントは特定のアドレスを要求し、データを受信します。
各アドレス内で、多数のサーバーを実行できます。限界はハードウェアにあります。十分なハードウェア (RAM、プロセッサ速度など) があれば、同じコンピューターを Web サーバー、FTP サーバー、およびメールサーバー(pop、smtp、imap、または上記のすべて) すべて同時に。各サービスはポートに関連付けられています。ポートはソケットにバインドされています。サーバーは関連付けられたポートをリッスンし、そのポートでリクエストを受信すると情報を提供します。
03/10ソケット経由の通信
したがって、ネットワーク接続に影響を与えるには、ホスト、ポート、およびそのポートで許可されているアクションを知る必要があります。ほとんどの Web サーバーはポート 80 で実行されます。ただし、インストール済みの Apache サーバーとの競合を避けるために、Web サーバーはポート 8080 で実行されます。他のサービスとの競合を避けるために、HTTP サービスをポート 80 または8080. これらは最も一般的な 2 つです。明らかに、これらが使用されている場合は、開いているポートを見つけて、ユーザーに変更を警告する必要があります。
ネットワーク クライアントと同様に、これらのアドレスはさまざまなサービスに共通のポート番号であることに注意してください。クライアントが正しいアドレスの正しいポートで正しいサービスを要求する限り、通信は行われます。 グーグルの たとえば、メール サービスは最初は共通のポート番号で実行されませんでしたが、アカウントへのアクセス方法を知っているため、ユーザーは引き続きメールを取得できます。
ネットワーク クライアントとは異なり、サーバー内のすべての変数は固定されています。常に実行されることが予想されるサービスでは、内部ロジックの変数をコマンド ラインで設定しないでください。これに関する唯一のバリエーションは、何らかの理由で、サービスを時々さまざまなポート番号で実行したい場合です。ただし、この場合でも、システム時間を監視して、それに応じてバインディングを変更することができます。
したがって、唯一のインポートは socket モジュールです。
|_+_||_+_|次に、いくつかの変数を宣言する必要があります。
04/10
ホストとポート
すでに述べたように、サーバーは関連付けられるホストとリッスンするポートを認識する必要があります。私たちの目的のために、サービスを任意のホスト名に適用する必要があります。
|_+_||_+_|前述のように、ポートは 8080 になります。したがって、このサーバーをネットワーク クライアントと組み合わせて使用する場合は、そのサーバーで使用されるポート番号を変更する必要があることに注意してください。 プログラム .
05/10
ソケットの作成
情報にアクセスするために、情報を要求するか提供するか インターネット 、ソケットを作成する必要があります。この呼び出しの構文は次のとおりです。
|_+_||_+_|認識されているソケット ファミリは次のとおりです。
- AF_INET: IPv4 プロトコル (TCP と UDP の両方)
- AF_INET6: IPv6 プロトコル (TCP と UDP の両方)
- AF_UNIX: UNIX ドメイン プロトコル
最初の 2 つは明らかにインターネット プロトコルです。これらのファミリでは、インターネット上を移動するすべてのものにアクセスできます。多くのネットワークはまだ IPv6 で動作していません。そのため、別の方法がわかっている場合を除き、IPv4 をデフォルトにして AF_INET を使用するのが最も安全です。
ソケットタイプは、ソケットを介して使用される通信のタイプを指します。 5 つのソケット タイプは次のとおりです。
- SOCK_STREAM: 接続指向の TCP バイト ストリーム
- SOCK_DGRAM: データグラムの UDP 転送 (クライアント サーバーの確認に依存しない自己完結型の IP パケット)
- SOCK_RAW: 生のソケット
- SOCK_RDM: 信頼できるデータグラム用
- SOCK_SEQPACKET: 接続を介したレコードの順次転送
IP スイートの 2 つのプロトコル (TCP と UDP) で機能するため、最も一般的なタイプは SOCK_STEAM と SOCK_DGRAM です。後者の 3 つは非常にまれであるため、常にサポートされているとは限りません。
それでは、ソケットを作成して変数に割り当てましょう。
|_+_||_+_| 06/10ソケット オプションの設定
ソケットを作成したら、ソケット オプションを設定する必要があります。どのソケット オブジェクトでも、setsockopt() メソッドを使用してソケット オプションを設定できます。構文は次のとおりです。
socket_object.setsockopt(level, option_name, value) この目的のために、次の行を使用します。|_+_|
07/10
「レベル」という用語は、オプションのカテゴリを指します。ソケットレベルのオプションには、SOL_SOCKET を使用します。プロトコル番号については、IPPROTO_IP を使用します。 SOL_SOCKET は、ソケットの定数属性です。各レベルの一部として使用できるオプションは、オペレーティング システムと、IPv4 または IPv6 のどちらを使用しているかによって決まります。
Linux および関連する Unix システムのドキュメントは、システムのドキュメントにあります。 Microsoft ユーザー向けのドキュメントは、MSDN Web サイトにあります。この記事を書いている時点では、ソケット プログラミングに関する Mac のドキュメントは見つかりませんでした。 Mac は大まかに BSD Unix に基づいているため、完全なオプションを実装する可能性があります。
このソケットの再利用性を確保するために、SO_REUSEADDR オプションを使用します。サーバーが開いているポートでのみ実行されるように制限することもできますが、それは不要なようです。ただし、2 つ以上のサービスが同じポートに展開されている場合、影響は予測できないことに注意してください。どのサービスがどのパケットの情報を受信するかを特定することはできません。
最後に、値の '1' は、ソケット上の要求がプログラムで認識される値です。このようにして、プログラムは非常に微妙な方法でソケットをリッスンできます。
ポートをソケットにバインドする
ソケットを作成してオプションを設定したら、ポートをソケットにバインドする必要があります。
|_+_||_+_|バインドが完了したら、コンピューターに待機してそのポートでリッスンするように指示します。
|_+_||_+_|サーバーを呼び出した人にフィードバックを提供したい場合は、印刷コマンドを入力して、サーバーが稼働中であることを確認できます。
08/10サーバー リクエストの処理
サーバーをセットアップしたら、次に伝える必要がありますパイソン指定されたポートでリクエストが行われたときに何をするか。このために、リクエストをその値で参照し、永続的な while ループの引数として使用します。
リクエストが行われると、サーバーはリクエストを受け入れ、それと対話するファイル オブジェクトを作成する必要があります。
|_+_||_+_|この場合、サーバーは読み取りと書き込みに同じポートを使用します。したがって、makefile メソッドには引数 'rw' が与えられます。バッファー サイズのヌル長は、ファイルのその部分を動的に決定する必要があるだけです。
09/10 クライアントへのデータの送信シングル アクション サーバーを作成する場合を除き、次のステップはファイル オブジェクトから入力を読み取ることです。それを行うとき、その入力から余分な空白を取り除くように注意する必要があります。
|_+_||_+_|リクエストはアクションの形式で送信され、その後にページ、プロトコル、使用されているプロトコルのバージョンが続きます。 Web ページを提供したい場合は、この入力を分割して要求されたページを取得し、そのページを変数に読み込み、ソケット ファイル オブジェクトに書き込みます。ファイルを辞書に読み込む機能は、ブログにあります。
このチュートリアルをソケットモジュールで何ができるかをもう少し説明するために、サーバーのその部分を省略し、代わりにデータの表現をどのように微妙に変えることができるかを示します.次の数行を プログラム .
|_+_||_+_| 10/10最終分析とシャットダウン
Web ページを送信する場合、最初の行は Web ブラウザーにデータを導入する良い方法です。省略した場合、ほとんどの Web ブラウザーは既定でレンダリングを行います。 HTML .ただし、それを含める場合は、「OK」の後に続く必要があります。 2 改行文字。これらは、プロトコル情報とページ コンテンツを区別するために使用されます。
おそらく推測できるように、最初の行の構文は、プロトコル、プロトコル バージョン、メッセージ番号、およびステータスです。移動した Web ページにアクセスしたことがある場合は、おそらく 404 エラーを受け取ったことがあるでしょう。ここでの 200 メッセージは単に肯定的なメッセージです。
残りの出力は、数行に分割された単なる Web ページです。出力でユーザーデータを使用するようにサーバーをプログラムできることに注意してください。最後の行は、サーバーが受信した Web 要求を反映しています。
最後に、リクエストの終了動作として、ファイル オブジェクトとサーバー ソケットを閉じる必要があります。
|_+_||_+_|このプログラムをわかりやすい名前で保存します。 「python program_name.py」で呼び出した後、サービスが実行中であることを確認するメッセージをプログラムした場合、これが画面に出力されます。端末は一時停止しているように見えます。すべてはあるべき姿です。 Web ブラウザーを開き、localhost:8080 に移動します。次に、指定した書き込みコマンドの出力が表示されます。スペースの都合上、このプログラムではエラー処理を実装していないことに注意してください。ただし、「ワイルド」にリリースされたプログラムはすべてそうすべきです。