はじめに
ネットワークおよび通信プログラミングは、あらゆるプログラミング言語の特に強力な使用法です。最近では、コンピューターが単独で動作するよりも、コンピューターが相互に(またはインターネットなどのネットワーク全体と)インターフェースをとるのがはるかに一般的であり、そのコミュニケーションがどのように行われるかを正確に知ることは、プログラマー。 Pythonの愛好家であれば、Pythonにはネットワークプログラミングを簡単にするために設計された完全なライブラリがいくつかあることをご存知かもしれません。
。
前提条件
- 任意のバージョンのPython(CentosにPython 2.7をインストールするためのガイドを参照)
- Pythonの基本的な理解
ソケット
最も基本的で便利なインポートライブラリの1つは、socket
です。 図書館。これにより、プログラマーはソケットと呼ばれるネットワーク接続を定義、作成、使用、および破棄できます。 。
つまり、正確には ソケット?ネットワーク用語では、ソケットは接続のエンドポイントであり、IPアドレスとポート番号によって定義されます。接続では、ソースと宛先のソケットのペアを使用します。
プログラムは通常、ソケットを使用して2台のコンピューターが通信できるようにします。ソケットを使用して、異なるアプリケーション間、または同じプログラムの異なる部分間でデータを渡すこともできます。ソケットが、実行中のアプリケーションの2つのアプリケーションまたは2つの別個の部分、つまり接続をリッスンするサーバー部分と、サーバーへの接続を試みるクライアント部分のいずれかでどのように機能するかを示すことができます。たとえば、コンピュータがWebページを要求すると、ソケットを開き、通常はポート80(HTTPの場合)にバインドし、同じポートとソケット識別子を使用してWebサーバーに接続します。関連するすべての通信は、そのエンドポイントを通過します。通信が終了すると、クライアントはソケットとそれがバインドされている接続を閉じます。
Pythonのソケットライブラリは十分に開発されており、使いやすいです。ライブラリを使用するには、import socket
を配置します プログラムの開始時に。このコマンドを使用すると、プログラムはsocket()
などのソケットライブラリに含まれるすべての関数にアクセスできます。 (新しいソケットオブジェクトを作成します)、socketpair()
(新しいソケットオブジェクトのペアを作成します)、およびgethostbyname()
(ホスト名をそのIPアドレスにマップします)、いくつか例を挙げます。
。
ソケットライブラリを使った実験
ローカルマシンでソケットを試すために、Pythonスクリプトを記述して、開いているソケットを作成するサーバーアプリケーションを作成します。次に、そのコードを実行し、別のターミナルウィンドウで、サーバースクリプトで開いたポートを使用してローカルマシン(ローカルホスト上)にtelnetで接続します。
server.py
と呼ぶスクリプトから始めましょう 。このプログラムは、ソケットを開き、それをポートとプロトコルにバインドしてから、接続をリッスンします。
import socket # (1) host = '' # (2) port = 1234 # (3) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # (4) s.bind((host, port)) # (5) print 'Socket created' # (6) s.listen(10) # (7) print 'Socket listening' # (8) conn, addr = s.accept() # (9) print 'Connected with ' + addr[0] + ':' + str(addr[1]) # (10)
このファイルをserver.py
として保存します 。ターミナルウィンドウ(または、Windowsを使用している場合はコマンドプロンプト)で、ファイルの場所に移動して実行します。
python server.py
実行したままにして、2番目のターミナルウィンドウを開きます。そのウィンドウで、ポート1234でローカルホストへのTelnet接続を開始します。
telnet localhost 1234
接続すると、元のターミナルウィンドウに「Connectedwith 127.0.0.1:60426」などの出力が表示されますが、接続が終了する前に、クライアントウィンドウに「Connectedtolocalhost」と短時間表示されます。
。
ソケットコードの機能
では、ここで何が起こっているのでしょうか。各行を見てみましょう:
行(1)はsocket
をインポートします ライブラリを使用できるようにします。行(2)と(3)は、host
の変数を設定します およびport
、 それぞれ。空白のhost
変数(これは一重引用符で囲まれた空の文字列であり、ちなみに二重引用符ではありません)は、サーバーアプリケーションが接続に使用するローカルホストを含むすべての利用可能なインターフェースでリッスンすることを意味します。
行(4)は、2つのパラメーターを使用してソケット自体を作成します。最初のパラメータ、AF_INET
、は、IPv4アドレスを使用していることを意味します(IPv6アドレスではありません)。 2番目のパラメーターSOCK_STREAM
、は、このソケットがTCPパケットを使用することを意味します(UDPトラフィックはタイプSOCK_DGRAM
を使用します 動作は少し異なりますが、それはこの記事の範囲を超えています)。行(5)は、作成したソケットを(host, port)
にバインドします タプル。
行(7)は、行(5)でバインドしたソケットへの接続をリッスンするようにプログラムに指示します。 10
パラメータは、サーバーがクライアントを拒否する前に最大10の接続を受け入れることを示します。
行(9)は、サーバーが接続を受け入れると、接続に変数を割り当てます。行(10)は、サーバーと接続したクライアントのIPアドレスとポート番号を出力します。
。
ソケットを開いたままにする
このコードをテストしたところ、サーバーが接続をすぐに閉じたことがわかりました。これは特に役に立ちません。接続を介してデータがやり取りされるのを確認できるように、server.py
に4行のコードを追加します。 プログラム。
data = conn.recv(1024) # 11 conn.sendall(data) # 12 conn.close() # 13 s.close() # 14
繰り返しますが、このコードをターミナルウィンドウで実行してから、(別のターミナルから)telnet localhost 1234
に接続します。 、ローカルホストに接続しますが、今回は接続は開いたままになります。 Telnetウィンドウに単語を入力し、Return
を押します。;単語が同じ画面にエコーバックされ、接続が閉じます。
行(11)で、data
変数は、接続を介して受信したデータを格納します。
行(12)は、そのデータを接続を介してクライアントに送り返します。つまり、データをエコーします。
最後に、行(13)と(14)は、接続を閉じてソケットを破棄することにより、ちょっとしたハウスキーピングを練習します。特に、公開されるソケットベースのアプリケーションをコーディングする場合は、悪い考えではありません。
。
結論
このスクリプトは、Pythonのsocket
を使用してネットワーク接続を作成する方法の非常に基本的な例です。 モジュールを作成し、接続を介して通信してから、再度閉じます。本格的なアプリケーションははるかに複雑になりますが、基本的な通信構造とその背後にある理論は同じままです。
このチュートリアルを楽しんで、Pythonでソケットの操作を開始するのに十分なことを学んだことを願っています。その他のチュートリアルをもう一度確認し、信頼性の高いVPSホスティングソリューションを確認してください。
。
。