Python クライアントサーバソケット機能 TCPプロトコル編(anaconda-jupyter)

AIの知識&PythonANACONDA,jupyter,TCPプロトコル

クラッカーの攻撃の一つに「コンピューターへの不正侵入」がありますね。
 
ホワイトハッカーとしては、どうやって侵入するのか気になるところであります。
 
そこでanaconda-jupyterの環境を利用して、python3言語で簡単に「クライアント」と「サーバ」の機能をソケット通信を利用して構築し、通信の方法を確認したいと思います。
 
anacondaの開発環境の作成はこちらから
 

TCPとは

TCP(Transmission Control Protocol)は、トランスポート層で動作するデータを確実に送信するプロトコルです。
機能として通信速度の調整や、データが届かなかった場合の再送信があります。
通信方法は「ユニキャスト」で、クライアントがサーバーのアドレスを指定してクライアントとサーバーが1対1でデータを通信します。
(注意 ユニキャストはコンピュータネットワークにおいて、単一の送信相手を指定して、データを送信する通信方法です。)
 

クライアントサーバの確認方法

今回は、自分のパソコン内での通信になるので気兼ねなく、好き放題テストしてください。
 
anacondaからjupyterを起動して、クライアントのプログラムとサーバのプログラムを登録します。
そして、サーバのプログラムを起動して、次にクライアントのプログラムを起動して通信の機能を確認します。
 
ソースにはわかりやすくコメントを入れて、命令実行ごとにprint文でアウトプットを表示しています。
 

ソースの簡単な説明

サーバを起動して、クライアントと通信が繋がるごとにクライアントにサーバからのメッセージを表示します。
 
Server accessed.(1) 通信1回目のメッセージ
Server accessed.(2) 通信2回目のメッセージ
Server accessed.(3) 通信3回目のメッセージ
   :        :
 

ソケット-サーバ機能(001)

サーバ機能のプログラムです。
説明はプログラム内のコメントを参照してください。
 
# ******************************
# ソケット-サーバ機能(001)
# ******************************


# モジュールのインポート
# 低水準ネットワークインターフェース
import socket


# グローバル変数
# ダイナミックポート番号(49152~65535)
D_PORT_NO = 49152
# クライアントアクセス回数
access_cnt = 0


# ソケットの作成
#  AF_INET:ネットワーク層はIPv4を利用
#  SOCK_STREAM:TCPプロトコルを利用する
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


# 接続させたいホスト名(またはアドレス)とポート番号を設定
server.bind(("127.0.0.1", D_PORT_NO))


# クライアントからの接続の待ち受け開始
# 最大接続数は2に設定
server.listen(2)


print("サーバ起動しました。クライアントの接続待ち")


# クライアント接続時の処理
while True:


# 通信用ソケットの取得
# client:クライアントのソケット情報
# addr(アドレス):リモート接続のアドレス
    client, addr = server.accept()
    
    print("クラアインとから接続要求あり")
    print("クライアントのソケット情報=", client)
    print("リモート接続のアドレス", addr)


# メッセージの作成
    access_cnt += 1
    sending_message = "Server accessed.(" + str(access_cnt) + ")"
    
    print("送信メッセージ=",sending_message)


# メッセージの送信
    client.sendall(sending_message.encode("UTF-8"))


    print("送信メッセージ送信完了")


#クライアントの接続を切断
    client.close()
    
    print("クライアント切断完了")
 

ソケット-クライアント機能(002)

クライアント機能のプログラムです。
説明はプログラム内のコメントを参照してください。
 
# ******************************
# ソケット-クライアント機能(002)
# TCPクライアント
# ******************************


# モジュールのインポート
import socket


# グローバル変数
# 接続先ホストの名前(localhost)
HOST = "127.0.0.1"
# サーバ側のダイナミックポート番号(49152~65535)
D_PORT_NO = 49152
# 受信バッファの大きさ
BUFSIZE = 4096


# ソケットの作成
#  AF_INET:ネットワーク層はIPv4を利用
#  SOCK_STREAM:TCPプロトコルを利用する
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


print("client=", client)


print("ソケットの作成")


# サーバとの接続
client.connect((HOST, D_PORT_NO))


print("サーバと接続完了")


# サーバからのメッセージの受信
server_reception_data = client.recv(BUFSIZE)


print("サーバからの受信データ",server_reception_data.decode("UTF-8"))


# サーバの接続を切断
client.close()


print("サーバの切断完了")
 

クライアントサーバのテスト

各々のプログラムの実行結果を確認してください。
 
1.jupyterの「サーバ」のソースの上部メニューの「RUN」ボタンを押下します。
立ち上がるとサーバ側のアウトプットに
 
サーバ起動しました。クライアントの接続待ち
 
が表示されます。
 
2.jupyterの「クライアント」のソースの上部メニューの「RUN」ボタンを押下します。
立ち上がるとクラアインと側のアウトプットに
 
client= <socket.socket fd=860, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0>
ソケットの作成
サーバと接続完了
サーバからの受信データ Server accessed.(1)
サーバの切断完了
 
3.サーバ側のアウトプットには
 
クラアインとから接続要求あり
クライアントのソケット情報= <socket.socket fd=1404, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 49152), raddr=('127.0.0.1', 51738)>
リモート接続のアドレス ('127.0.0.1', 51738)
送信メッセージ= Server accessed.(1)
送信メッセージ送信完了
クライアント切断完了
 
これで、サーバとクライアントの通信ができました。
再度クライアントを実行すると
 
送信メッセージ= Server accessed.(2)
が表示されます。
 

Python クライアントサーバソケット機能 TCPプロトコル編(anaconda-jupyter)のまとめ

いかがでしたか。
シンプルな構成でクライアントサーバの機能が確認できたと思います。
 
ぜひ、上記のプログラムを自分流に改良して自分の疑問を解決してくださいね。
ソケット通信の方法やpythonの言語の理解が出来るとおもいます。
 

こんなエラーで困っていませんか?

上記ソースをコピペして実行すると以下のようなエラーが出る場合があります。
Input In [1]
    client, addr = server.accept()
    ^
SyntaxError: invalid non-printable character U+00A0
このエラーは、"client"の前にあるスペース4個がおかしいエラーです。
見た目にはスペースが4個入っています。
対応策としては
スペース4個を削除して、再度スペースを4個入力するとエラーは解消されます。