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.以下はクライアント側の実行結果です。
関連の記事