【Python】ネットワークプログラミング入門

Pythonを用いたネットワークプログラミングについて、ソースコード付きで入門者向けにまとめました。

【情報取得】IPアドレス、ホスト名、サービス名

ローカルIPアドレス取得

ローカルIPアドレスとは、家庭内LAN・企業内LANなど、組織内のネットワークでパソコン等の端末を識別するために使用されるIPアドレスです。
プライベートアドレスともいいます。
逆にインターネット上でのIPアドレスのことをグローバルIPアドレスといいます。

Pythonでは、socketモジュールのgethostbynameメソッドでローカルIPアドレスを取得できます。
※socketは標準モジュール

【書式】

socket.gethostbyname(ホスト名)

※返り値:ローカルIPアドレス

# -*- coding: utf-8 -*-
import socket


def main():
    # ローカルIPアドレスを取得
    ip = socket.gethostbyname(socket.gethostname())
    print(ip) # 192.168.○○○.○○○
    
if __name__ == "__main__":
    main()
関連記事
1 【Python】ローカルIPアドレスの取得

グローバルIPアドレス取得

グローバルIPアドレスとは、インターネット上でパソコン等の端末を識別するために使用されるアドレスです。
逆に会社や家庭内LANなど、組織内で使うネットワークアドレスのことをローカルIPアドレス(プライベートアドレス)といいます。

Pythonでは、urllibモジュールでグローバルIPアドレスを取得できます。
※urllibはPython3の標準モジュール

# -*- coding: utf-8 -*-
import urllib


# グローバルIPアドレスを取得
ip = urllib.request.urlopen('http://ipcheck.ieserver.net').read().decode('utf-8')

print(ip) # グローバルIPアドレス
関連記事
1 【Python】グローバルIPアドレスの取得

ホスト名取得

ホスト名とは、パソコンやプリンタなど、ネットワーク機器に付けられる名前です。

Pythonでは、socketモジュールのgethostnameメソッドでホスト名を取得できます。
※socketは標準モジュール

【書式】

socket.gethostname()

※返り値:ホスト名

# -*- coding: utf-8 -*-
import socket
 
host = socket.gethostname()
print(host) # ホスト名
関連記事
1 【Python】ホスト名の取得

サービス名取得

Pythonの標準モジュール「socket」のgetservbyportメソッドを使うことで、ポート番号とプロトコル名から「サービス名」を取得できます。

# -*- coding:utf-8 -*-
import socket

# ポート番号とプロトコル名からサービス名を取得
def service_name(port, protocol_name):
    print('Port:', port)
    print('protocolname:', protocol_name)
    print('Service name:', socket.getservbyport(port, protocol_name))
    print('--------------------')


service_name(port=80, protocol_name='tcp')
service_name(port=25, protocol_name='tcp')

"""
Port: 80
protocolname: tcp
Service name: http
--------------------
Port: 25
protocolname: tcp
Service name: smtp
--------------------
"""
関連記事
1 【Python】ポート番号とプロトコル名から「サービス名」を取得

リモートホスト名からIPアドレス取得

Pythonの標準モジュール「socket」のgethostbynameメソッドを使うことで、リモートホスト名からIPアドレスを取得できます。

# -*- coding:utf-8 -*-
import socket

# ポート番号とプロトコル名からサービス名を取得
def get_remote_ip(remote_host):
    print('Remote host name:', remote_host)
    print('Remote IP:', socket.gethostbyname(remote_host))
    print('--------------------')


get_remote_ip(remote_host='www.yahoo.co.jp')

"""
Remote host name: www.yahoo.co.jp
Remote IP: 182.22.24.252
--------------------
"""
関連記事
1 【Python】リモートホスト名からIPアドレスを取得

【ソケット通信】TCP/IPでチャット

Pythonでは、socketモジュールでソケット通信を実装できます。
今回は、簡単なチャットプログラムを作ります。

【内容】
サーバー側とクライアント側を実行します。
そして、サーバー側のコンソール画面に文章を入力すればクライアント側にも表示されます。
次に、クライアント側の画面から文章を入力すればサーバ側画面に表示されます。

サーバー側(server.py)

# -*- coding: utf-8 -*-
import socket

def main():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(("localhost", 50007))    # 指定したホスト(IP)とポートをソケットに設定
    s.listen(1)                     # 1つの接続要求を待つ
    soc, addr = s.accept()          # 要求が来るまでブロック
    print("Conneted by"+str(addr))  #サーバ側の合図

    while (1):
        data = input("Server>") # 入力待機(サーバー側)
        soc.send(data)              # ソケットにデータを送信
        data = soc.recv(1024)       # データを受信(1024バイトまで)
        print("Client>",data)       # サーバー側の書き込みを表示
        if data == "q":             # qが押されたら終了
            soc.close()
            break

main()

【処理】
①ソケットの作成と設定をする。
②クライアントからの接続要求があるまで待機する。
③クライアントからの接続要求があれば受け付ける。
④ソケット通信でデータ「UNTAN」をクライアントに送信する。
⑤TCP接続を終了する。
⑥⑤~⑦の処理を繰り返す。

クライアント側(client.py)

# -*- coding: utf-8 -*-
import socket

def main():
    soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    soc.connect(("localhost", 50007))

    while(1):
        data = soc.recv(1024)
        print("Server>", data)      # サーバー側の書き込みを表示
        data = input("Client>") # 入力待機
        soc.send(data)              # ソケットに入力したデータを送信

        if data == "q":             # qが押されたら終了
            soc.close()
            break

main()

【処理】
①ソケットの作成と設定をする。
②接続するサーバーのIPアドレスを指定する。
③サーバに接続する。
④サーバからデータを受信する。
⑤受信バッファ(データ)を表示する。

関連記事
1 【Python】ソケット通信(TCP/IP)でチャット

【試験】ping試験(死活監視)、

Pythonでping試験を使う場合、標準モジュール「subprocess」を使ってOSのpingコマンドを呼び出す方法が一般的です。
ただし、これだと外部環境に依存するためping試験ができる外部モジュールを使う手段もあります。

標準モジュール「subprocess」を使ってOSのpingコマンドを呼び出します。

# -*- coding: utf-8 -*-
import subprocess

class Ping(object):
    def __init__(self, hosts):
        for host in hosts:
            # pingコマンド
            ping = subprocess.Popen(["ping", "-c", "1", host],
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE
            )

            # ping試験
            out, error = ping.communicate()

            # 接続できなかったら
            if error:
                print('[NG]: ' +  host + ', Msg->\'' + error.rstrip() + '\'')

            # 接続できたら
            else:
                print('[OK]: ' +  host)

# ping試験するホスト
hosts = ['www.google.com', 'algorithm.joho.info',]

# ping試験
Ping(hosts)
関連記事
1 【Python】ping試験でサーバーの死活監視

【FTP接続】ファイルをサーバーにアップロード

Pythonには、FTPを使うための標準ライブラリ「ftplib」があります。
今回は、このライブラリで任意のファイルをサーバーにアップロードしてみました。

# -*- coding: utf-8 -*-
import ftplib

def ftp_upload(hostname, username, password, upload_src_path, upload_dst_path):
    # FTP接続・アップロード
    ftp = ftplib.FTP(host_name)
    ftp.set_pasv("true")
    ftp.login(username, password)
    fp = open(upload_src_path, 'rb')
    ftp.storbinary(upload_dst_path ,fp)

    # 終了処理
    ftp.close()
    fp.close()


hostname = "xxx.xxx.xxx" # 接続先サーバーのホスト名
upload_src_path = "test.csv" # アップロードするファイルパス
upload_dst_path = "STOR /sample/test.csv" # アップロード先のファイルパス
username = "user" # サーバーのユーザー名
password = "password" # サーバーのログインパスワード

ftp_upload(hostname, username, password, upload_src_path, upload_dst_path)

FTPソフトで確認すると、指定したディレクトリにtest.csvが保存されていました。
尚、指定したディレクトリが存在しない場合はエラーとなります。

関連記事
1 【Python】FTPでサーバーにファイルをアップロード
2 【Python】Webスクレイピング入門(BeautifulSoup4編)
4 【Python入門】基礎文法・サンプル集
関連記事