これは、このプログラムを実行するための基本的なセットアップ図です。
簡単にするために、この記事ではシステムAをA_clientと呼び、システムBをB_serverと呼びます。
ファイル要件:
必要です server.py このファイルはサーバーシステムに存在する必要があります。この場合、server.pyはB_serverシステムにあるはずです。
別の2つのファイル client.py と sample.txt クライアントシステムに存在する必要があります。この場合、これら2つのファイルはA_clientシステムに存在する必要があります。
仮定:
前提条件は次のとおりです。
- ターミナルにアクセスできる2つのLinuxシステムが必要です。
- 望ましいLinuxフレーバーは Ubuntu 。
- Python3をインストールする必要があります。
- 両方のLinuxシステムが相互にpingできる必要があります。使用する ping pingをチェックするコマンド。
- 1つのシステムはサーバーとして機能し、他のシステムは特定の時間にクライアントとして機能する必要があります。
制限:
先に進む前に、このプログラムにはいくつかの制限があることを知っておく必要があります。
- このプログラムを実行するには、Python3 +をインストールする必要があります。 Pythonの古いバージョンで実行すると、エラーや異なる動作が発生する場合があります。
- 現在、このプログラムを介して転送できるのはテキストファイルのみです。テキストを含まない他のフォーマットファイルは失敗する可能性があります。
- 基本的なプログラミングの例外は、プログラムで処理されています。
- プログラムは、Ubuntu以外のOSで実行される場合と実行されない場合があります。
- 1024バイトのバッファサイズが使用されているため、テキストファイルはクライアント側で短くする必要があります。
要件を設定します。
- このプログラムを試すには、少なくとも1つのLinuxシステムが必要です。ただし、ネットワークを介して接続されている2つの異なるLinuxシステムを使用することをお勧めします。
- 2つのシステムは、イーサネット、Wi-Fi、またはその他の接続を介して接続する必要があります。
サーバーのソースコード:
https://github.com/linuxhintcode/websamples/blob/master/python_send_file/server.py
クライアントのソースコード:
https://github.com/linuxhintcode/websamples/blob/master/python_send_file/client.py
プログラムの実行方法と期待される出力:
プログラムを実行する手順は次のとおりです。
ステップ1:B_serverシステムに移動し、ターミナルを開きます。ターミナルを開くためのショートカットは Alt + Ctrl + t。
ステップ2:server.pyが存在するパスに移動します。
ステップ3:次のようにserver.pyを実行します
python3サーバー。pyエラーはないはずで、以下のプリントが表示されます。
サーバーはポートにリストされています:9898コピーされたファイル名はサーバー側でrecv.txtになります
ステップ4:A_clientシステムでターミナルを開きます。
ステップ5:client.pyとsample.txtが存在するパスに移動します。
ステップ6:以下のようにclient.pyを実行します
python3クライアント。py <B_serverシステムIP>>サーバーのIPアドレスを知る必要があることがわかりました。以下のコマンドを実行して、B_serverシステムのIPアドレスを知ることができます。
ifconfig
これで、A_clientシステムの出力は次のようになります。
##################以下のメッセージがサーバーから受信されます##################| --------------------------------- |
こんにちはクライアント[IPアドレス:192.168.1.102]、
**サーバーへようこそ**
-サーバ
| --------------------------------- |
ステップ7:B_serverに移動し、以下の出力を探します
ファイルは正常にコピーされましたサーバは接続を閉じました
ステップ8:サーバーフォルダーに1つのファイル名recv.txtがあるはずです。このrecv.txtの内容は同じsample.txtである必要があります。
これで、Pythonプログラムを介してネットワーク経由でクライアントからサーバーにファイルを正常にコピーできました。
コードの説明:
2つのPythonファイルがあります server.py と client.py 。
server.pyとclient.py内で同じコードがあるかどうかを一度説明することに注意してください。
- server.py:
これはシバンラインです。これは、デフォルトでこのserver.pyがpython3を使用する必要があることを意味します。このラインの利点の1つを見てみましょう。
server.pyまたはclient.pyを次のように実行しました python3。 これで、python3を使用せずに、pythonファイルを実行できます。以下のコマンドに従ってください
スーパーユーザーモードに移動します。
これは.pyファイルにすべての権限を付与します。
chmod777サーバ。pyserver.pyを実行します。
。/サーバ。py 輸入 ソケットインポートソケットPythonプログラムへのライブラリなので私たちは行きます
使用するソケット にとって繋がり。
NS = ソケット。ソケット(()。
オブジェクトを作成しています NS ソケットのすべてのメソッドにアクセスします。これはOOPの概念です。
港= 9898ここで、サーバーがリッスンするポートを1つ選択します。これの代わりに、予約されていないポートを使用できます。
NS。練る((((''、港)。)。bindメソッドを使用して、サーバーのIPアドレスをそのポートにバインドします[9898]。 1つの観察結果は、bindメソッドの最初の引数の代わりにサーバーの正確なIPアドレスを使用できた可能性があることですが、これは正常に機能するため、空白のままにすることを選択します。
NS。練る((((IPアドレス、港)。)。ファイル = 開いた(('recv.txt'、 'wb')。
書き込みモード用にサーバーで1つのファイル名recv.txtを開き、ファイルポインターを取得しました。クライアントから1つのテキストファイルをコピーする必要があるため、これは必須です。
その間 NS:サーバーの仕事は、クライアントがその9898ポートでサーバーと通信するまで待機することなので、1つの無限のwhileループを開始しましょう。したがって、このwhileループが必要です。
conn、addr=NS。受け入れる(()。このコードは、クライアントからの着信接続要求を受け入れるためのものです。 Connは使用します conn クライアントと通信し、 addr ポート9898でこのサーバーにcommotionリクエストを送信したクライアントのIPアドレスです。
msg= 'NSNS| --------------------------------- |NSこんにちはクライアント[IPアドレス:'+アドレス[0]+']、NS**サーバーへようこそ**NS-サーバNS
| --------------------------------- |NS NSNS'
このコードは、クライアントに送信するメッセージを作成するためのものです。このメッセージはクライアント端末に出力されます。これにより、クライアントがサーバーと通信できることが確認されます。
conn。送信((msg。エンコード(()。)。これでメッセージの準備が整い、それを使用してクライアントに送信します conn。 このコードは実際にクライアントにメッセージを送信します。
RecvData=conn。recv((1024)。このコードは、クライアント側から送信されたすべてのデータを受信しています。私たちの場合、sample.txtの内容を次のように期待しています。 RecvData 。
その間RecvData:条件RecvDataのもう1つのwhileループは空ではありません。私たちの場合、それは空ではありません。
ファイル。書きます((RecvData)。中にコンテンツが入ったら RecvData 次に、そのファイルに書き込みます recv.txt ファイルポインタを使用する ファイル。
RecvData=conn。recv((1024)。クライアントからのデータがあるかどうかを再度受信しようとします。一度 RecvData データがない場合、コードはwhileループを中断します。
ファイル。選ぶ(()。これにより、ファイルの書き込みが完了したので、ファイルポインタが閉じます。
conn。選ぶ(()。これにより、クライアントとの接続が閉じられます。
壊すこれは、B_serverでの無限のwhileループから発生します。
- client.py:
必要に応じてsysライブラリをインポートすると、Pythonで引数機能が使用されます。
もしも ((len((sys。argv)。 >> 1)。:ServerIp= sys。argv[1]
そうしないと:
印刷(('NSNSのように実行NSpython3 client.pyNSNS')。
出口((1)。
実行中にファイル名client.pyの後にB_serverのIPアドレスを渡すため、クライアント内でそのサーバーのIPアドレスを取得する必要があります。
…..if(len(sys.argv)> 1):=>ユーザーが少なくとも1つの引数をIPアドレスとして渡し、そのIPアドレスインディーをキャッチすることを確認するには ServerIP。
ユーザーが少なくとも1つの引数を渡さない場合、コードはヘルプを表示し、コードから出てきます。
港= 9898これは、B_server側で説明したものと同じポートである必要があります。
NS。接続((((ServerIp、港)。)。このコードは、そのポートを使用してサーバーIPへのTCP接続を行います。このポニントで何か問題があると、接続に失敗します。
ファイル = 開いた(('sample.txt'、 'rb')。読み取り専用のコンテンツを読み取るために、sample.txtを読み取りモードで開きます。
データを送る= ファイル。読んだ((1024)。ファイルの内容を読んで中に入れる データを送る 変数。
その間データを送る:次の場合、whileループを開始します データを送る データがあります。この場合、sample.txtが空でない場合は、データが含まれているはずです。
NS。送信((データを送る)。これで、のコンテンツを送信できます sample.txt ソケットオブジェクトを使用してサーバーに NS。
データを送る= ファイル。読んだ((1024)。何か残っているかどうかもう一度読んでください。したがって、ファイルから読み取るものは何もありません データを送る 空になり、whileループから出てきます。
NS。選ぶ(()。これは、クライアント側からの接続を閉じません。
Ubuntuスクリーンショットサーバー側
Ubuntuスクリーンショットクライアント側
テストされた組み合わせ:
- サーバーとしてのLinuxおよびクライアントとしてのLinux:PASS
- クライアントとしてのLinuxおよびサーバーとしてのLinux:PASS
- サーバーとしてのLinuxとクライアントとしてのWindows10:PASS
- クライアントとしてのLinuxとサーバーとしてのWindows10:PASS
サーバーとクライアントに2つのLinuxシステムを使用することをお勧めします。
予想されるエラー:
- サーバーが9898ポートで実行されていない場合は、以下のエラーが表示されます。
トレースバック(最後の最後の呼び出し):
ファイル'client.py'、ライン22、 の <モジュール>>NS。接続((((ServerIp、港)。)。
ConnectionRefusedError:[エルノ111]接続拒否
- クライアント側でIPアドレスが渡されない場合、以下のエラーが表示されます
のように実行
python3クライアント。py <サーバのIPアドレス>>- 以下のエラーは、1の場合に見られますNSクライアント側の引数はIPアドレスではありません
トレースバック(最後の最後の呼び出し):
ファイル'client.py'、ライン22、 の <モジュール>>NS。接続((((ServerIp、港)。)。
ソケット。gaierror:[エルノ-2]名前またサービスいいえ既知
- ポートが98980のように使用されている場合、以下のエラーが表示されます
トレースバック(最後の最後の呼び出し):
ファイル'client.py'、ライン22、 の <モジュール>>NS。接続((((ServerIp、港)。)。
OverflowError:getsockaddrarg:ポートは0-65535。
- sample.txtがクライアント側に存在しない場合、以下のエラーが表示されます。
トレースバック(最後の最後の呼び出し):
ファイル'client.py'、ライン25、 の <モジュール>>ファイル = 開いた(('sample.txt'、 'rb')。
FileNotFoundError:[エルノ2]そのようなありませんファイル またディレクトリ:'sample.txt'
結論:
このプログラムを使用すると、Pythonプログラムを使用して、ネットワークを介して1つのシステムから別のシステムに簡単なテキストファイルを送信できます。これにより、ネットワーク経由でデータを送信するためのPythonおよびソケットプログラミングの基本的な学習が可能になります。