サル(高校生)でもわかるPythonでのsocket通信。
※この記事は
「サイバーセキュリティプログラミング〜pythonで学ぶハッカーの思考〜」
という書籍を参考にして書いています。
ずっと欲しかった本を手に入れられて、早速勉強をはじめました。
とてもわかり易く書かれているので、ある程度Pythonを触ったことがある人なら楽に読み進められると思います。
今回のテーマ
pythonでTCPサーバーを建ててTCPクライアントとsocket通信する
ますはTCPクライアント。こっちは特に問題なく理解できた
#tcpclient.py import socket target_host = "localhost" target_port = 9999 #ソケットオブジェクトを作成 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #接続 client.connect((target_host,target_port)) #送信 client.send("hogehoge") #受信 response = client.recv(4096) #受信したデータを表示 print response
下から3行目のclient.recv()の数字は受信するデータ量を指定します。
ハードウェアやネットワークのシステム上、2の累乗にすべきだそうです。
続いてTCPサーバー。threadingについてほとんど無知だったので理解に時間がかかった。
#tcpserver.py import socket import threading ip_addr = "localhost" port = 9999 svr = socket.socket(socket.AF_INET, socket.SOCK_STREAM) svr.bind((ip_addr,port)) #接続キューの最大数を指定 svr.listen(2) print("Listening on %s:%d" % (ip_addr,port)) def handle_client(client_socket): #クライアントからデータを受信 req = client_socket.recv(1024) print("Received:" + req) #データの返送 client_socket.send("Hello World") #closeを忘れずに! client_socket.close() while True: client,addr = svr.accept() print("connection from %s:%d" % (addr[0] , addr[1])) #Threadの定義・起動 client_handler = threading.Thread(target = handle_client, args=(client,)) client_handler.start()
下から五行目socket.accept()は接続を受け付けるソケットオブジェクト。
戻り値が(conn,address)のペアなので、2つの変数に格納する必要がある。
address(addr)は、接続先のアドレス、conn(client)は、接続を通じてデータを送受信するためのソケットオブジェクトを示す。
また、connのデータは関数client_handlerに引数として渡す。(下から二行目)
実行
先にtcpserver.pyを実行した後、tcpclient.pyでいざ通信!
tcpserver.py
$ python tcpserver.py Listening on localhost:9999 connection from 127.0.0.1:50700 Received:hogehoge
tcpclient.py
$ python tcpclient.py Hello World
問題なく通信できました!
とてもシンプルなコードですが、これをベースに発展させていくようなのでしっかりと理解できてよかったです。
試験勉強しなきゃ...