pythonのsocketでEchoサーバ作成!

はじめに

socketモジュールを使ってEchoサーバをつくります.
実行環境はpython2.7.13です.

ソースコード

server.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket
import threading

# クライアントのアドレス情報
addr = ""

def main():
    global addr

    # サーバ側ポートの指定
    port = int(raw_input("[?] Server port : "))

    # ソケットを生成しバインド
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(("0.0.0.0", port))

    # コネクションの上限を5に設定し、リスニング開始
    server.listen(5)

    print "[*] Server started on %s:%d" % ("0.0.0.0", port)

    while True:
        # クライアント接続の認識
        client,addr = server.accept()

        print "[*] Connection received from %s:%d" % (addr[0],addr[1])
        client.send("[<=] Hello! This is echo server.\n")
        client.send("[!!] If you want to disconnect, please type \"quit\".")

        # クライアントのコネクションをハンドリングするスレッドの生成と実行
        client_handle_thread = threading.Thread(
            target=client_handler,
            args=(client,)
        ).start()

def client_handler(client):
    global addr

    while True:
        # メッセージの受信と整形
        message = client.recv(4096)
        message = message.rstrip()

        print "[=>] Received message \"%s\" from %s:%d" % (message, addr[0], addr[1])
        if message != "quit":
            client.send("[<=] Echo : %s" % message)
        else:
            client.send("[<=] Goodbye.")
            print "[*] Connection end %s:%d" % (addr[0],addr[1])
            client.close()
            break

main()

client.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket
import sys

def main():

    # 接続先サーバのポートの指定
    port = int(raw_input("[?] Server port : "))

    # ソケットの生成と接続
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(("0.0.0.0", port))

    print client.recv(4096)

    while True:
        # メッセージの入力
        message = raw_input("[=>] Message : ")

        if message != "quit":
            client.send(message)
            print client.recv(4096)
        else:
            client.send(message)
            print client.recv(4096)
            client.close()
            sys.exit(0)

main()

実行結果

server.py

# python2 server.py 
[?] Server port : 8080
[*] Server started on 0.0.0.0:8080
[*] Connection received from 127.0.0.1:36628
[=>] Received message "hello" from 127.0.0.1:36628
[=>] Received message "こんにちは" from 127.0.0.1:36628
[=>] Received message "hogehoge" from 127.0.0.1:36628
[=>] Received message "quit" from 127.0.0.1:36628
[*] Connection end 127.0.0.1:36628

client.py

# python2 client.py 
[?] Server port : 8080
[<=] Hello! This is echo server.
[!!] If you want to disconnect, please type "quit".
[=>] Message : hello
[<=] Echo : hello
[=>] Message : こんにちは
[<=] Echo : こんにちは
[=>] Message : hogehoge
[<=] Echo : hogehoge
[=>] Message : quit
[<=] Goodbye.

参考

サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考

サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考

d.hatena.ne.jp