初心者向けのPythonソケット

まえがき


私は2010年に、初心者向けにPythonのソケットに関する記事を書きました。 今、このブログは忘却に沈んでいますが、この記事は私にとってかなり有用なものに思えました。 Libra文書でフラッシュドライブの記事を見つけたので、これはクロスポストではなくコピーペーストではなく、インターネット上のどこにもありません。



これは何ですか


まず、ソケットとは何か、なぜ必要なのかを理解する必要があります。 wikiが言うように、ソケットはプロセス間の情報交換を提供するためのソフトウェアインターフェイスです。 しかし、定義を暗記するのではなく、本質を理解することがより重要です。 したがって、ここでは可能な限り詳細かつシンプルにすべてを説明しようとします。

クライアントとサーバーのソケットがあります。 何が何なのか簡単に推測できます。 サーバーソケットは特定のポートでリッスンし、クライアントソケットはサーバーに接続します。 接続が確立されると、データ交換が開始されます。


これを簡単な例で考えてみましょう。 多くの小さな窓がある大きな部屋を想像してください。その後ろには女の子が立っています。 誰もいない空のウィンドウもあります。 これらのウィンドウはポートです。 女の子がいるところ、これは開いているポートであり、背後には彼の話を聞くある種のアプリケーションがあります。 つまり、番号9090のウィンドウに移動すると、挨拶が表示され、どのように役立つかを尋ねられます。 したがって、ソケットを使用します。 ポートでリッスンするアプリケーションが作成されます。 クライアントがこのポートでサーバーとの接続を確立すると、この特定のアプリケーションがこのクライアントの作業を担当します。 あなたは一つの窓に来ることはなく、彼らは隣の窓からあなたに叫ぶでしょう:)

接続に成功すると、サーバーとクライアントは情報の交換を開始します。 たとえば、サーバーは挨拶とコマンドを入力するプロンプトを送信します。 次に、クライアントがコマンドを入力し、サーバーがコマンドを分析して必要な操作を実行し、クライアントに結果を提供します。

サーバー


サーバー用とクライアント用の2つのファイルを作成します。

Pythonはソケットモジュールを使用してソケットを操作します。

import socket 


まず、ソケットを作成する必要があります。

 sock = socket.socket() 


ここには特別なものはなく、この部分はクライアントとサーバーの両方のソケットに共通です。 さらに、サーバーのコードを記述します。 これは非常に論理的です-接続する場所がない場合、なぜクライアントアプリケーションを記述する必要があります:)

次に、サーバーのホストとポートを決定する必要があります。 ホストについては、行を空のままにして、サーバーがすべてのインターフェイスからアクセスできるようにします。 また、0〜65535のポートを使用します。ほとんどのオペレーティングシステムでは、0〜1023の番号のポートをリッスンするには特別な特権が必要です。 ポート9090を選択しました。ここで、タプルが送信されるbindメソッドを使用して、指定されたホストとポートにソケットを接続します。

 sock.bind(('', 9090)) 


これで、接続を受け入れるように設定されました。 listenメソッドを使用して、このソケットのリッスンを開始します。 このメソッドは、引数を1つ(キュー内の接続の最大数)取ります。 想像力をかきたて、窓のあるホールを思い出します。 したがって、このパラメーターはキューのサイズを決定します。 それが1に設定されていて、明らかに余分な誰かがまだ後ろに調整しようとしている場合、彼らはそれを送信します:) 1つにインストールします:

 sock.listen(1) 


最後に、acceptメソッドを使用して接続を受け入れることができます。acceptメソッドは、新しいソケットとクライアントアドレスという2つの要素を持つタプルを返します。 クライアントへのデータの送受信に使用されるのはこのソケットです。

 conn, addr = sock.accept() 


以上です。 これで、クライアントとの通信が確立され、クライアントと「通信」できます。 なぜなら クライアントがどのボリュームでどのボリュームで送信するかを正確に知ることができない場合、クライアントから少しずつデータを受信します。 データを取得するには、読み取るバイト数を引数として取るrecvメソッドを使用する必要があります。 1024バイト(または1 kb)の部分を読み取ります。

 while True: data = conn.recv(1024) if not data: break conn.send(data.upper()) 


クライアントと通信するように言ったように、acceptメソッドの結果として取得されたソケットを使用します。 無限ループでは、recvメソッドを使用して1024バイトのデータを受け取ります。 データがもうない場合、このメソッドは何も返しません。 したがって、クライアントから任意の量のデータを受信できます。

さらにこの例では、明確にするために、受信したデータで何かを実行し、クライアントに送り返します。 たとえば、文字列でupperメソッドを使用すると、クライアントに大文字の文字列が返されます。

これで接続を閉じることができます:

 conn.close() 


実際にサーバーは準備ができています。 接続を受け入れ、クライアントからデータを受信し、それらを大文字の文字列として返し、接続を閉じます。 すべてがシンプルです:)その結果、次のものが必要になります。

 #!/usr/bin/env python # -*- coding: utf-8 -*- import socket sock = socket.socket() sock.bind(('', 9090)) sock.listen(1) conn, addr = sock.accept() print 'connected:', addr while True: data = conn.recv(1024) if not data: break conn.send(data.upper()) conn.close() 


お客様


今はもっと簡単になると思います。 また、クライアントアプリケーション自体は単純です。ソケットを作成し、サーバーに接続し、サーバーにデータを送信し、データを受信して​​接続を閉じる必要があります。 これはすべて次のように行われます。

 #!/usr/bin/env python # -*- coding: utf-8 -*- import socket sock = socket.socket() sock.connect(('localhost', 9090)) sock.send('hello, world!') data = sock.recv(1024) sock.close() print data 


すべてが明確だと思う すべてがすでにより早く整理されました。 ここで唯一新しいことは、サーバーに接続するconnectメソッドです。 次に、1024バイトのデータを読み取り、ソケットを閉じます。

Source: https://habr.com/ru/post/J149077/


All Articles