Python ソケット通信のサンプル

Pythonのソケット通信のサンプルです。

確認環境
・Python 3.7.0

目次

サンプル ソケット通信
  サーバー側のコード
  クライアント側のコード

ソケット通信

  • ソケットは、OSに実装されている機能です。
  • IPアドレスとポート番号を指定して通信します。
  • サーバー側は待ち状態で起動します。
  • クライアント側はサーバー側に接続しに行きます。
  • サーバー側はクライアント側から要求を受けて処理をします。

 

サンプルのコードについて

サーバー側とクライアント側のコードがあります。
クライアント側で、
偶数の数値を入力するとサーバーは「OK」を返します。
奇数の数値を入力するとサーバーは「NG」を返します。
数値以外を入力するとメッセージを返します。
byeと入力するとサーバー側とクライアント側の処理が終了します。

サーバー側のコード

以下は、サーバー側のコードです。ファイル名はserver1.pyです。

# coding: utf-8

# ソケット通信(サーバー側)
import socket

host1 = '127.0.0.1'
port1 = 8765

socket1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket1.bind((host1, port1))
socket1.listen(1)

print('クライアントからの入力待ち状態')

# コネクションとアドレスを取得
connection, address = socket1.accept()
print('接続したクライアント情報:'  + str(address))

# 無限ループ byeの入力でループを抜ける
recvline = ''
sendline = ''
num = 0
while True:

    # クライアントからデータを受信
    recvline = connection.recv(4096).decode()

    if recvline == 'bye':
        break

    try:
        num = int(recvline)

        if num % 2 == 0:
            sendline = 'OKです'.encode('utf-8')
        else:
            sendline = 'NGです'.encode('utf-8')
        connection.send(sendline)

    except ValueError as e:
        # 送信用の文字を送信
        sendline = '数値を入力して下さい'.encode('utf-8')
        connection.send(sendline)
    finally:
        print('クライアントで入力された文字=' + str(recvline))
        
# クローズ
connection.close()
socket1.close()
print('サーバー側終了です')

28行目は、クライアントで入力された値がbyeの場合はループを終了します。
32行目のrecvlineは、str型でint型に変換しています。
変換エラーが発生した場合は、40行目でキャッチされます。

クライアント側のコード

以下は、クライアント側のコードです。ファイル名はclient1.pyです。

# coding: utf-8

# ソケット通信(クライアント側)
import socket

ip1 = '127.0.0.1'
port1 = 8765
server1 = (ip1, port1)

socket1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket1.connect(server1)

line = ''
while line != 'bye':
    # 標準入力からデータを取得
    print('偶数の数値を入力して下さい')
    line = input('>>>')
    
    # サーバに送信
    socket1.send(line.encode("UTF-8"))
    
    # サーバから受信
    data1 = socket1.recv(4096).decode()
    
    # サーバから受信したデータを出力
    print('サーバーからの回答: ' + str(data1))

socket1.close()
print('クライアント側終了です')

14行目は、byeと入力があった場合はループ処理を終了します。

確認

1.コマンドプロンプトを2つ立ち上げ、先にサーバー側のserver1.pyを起動し、次にクライアント側のclient1.pyを起動します。

2.以下はサーバー側の実行結果です。

3.以下はクライアント側の実行結果です。

関連の記事

Python 数値と文字列の変換のサンプル

△上に戻る