Pythonでソケット通信を実装しメッセージの送受信を行う

2021-07-25
pythonlinux%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF
    

目次

概要

Pythonでソケット通信を実現する方法です。

ソース

server.py

サーバ側のソースです。

import socket

# ソケットオブジェクトの生成
# socket.AF_INET: IPv4の利用
# socket.SOCK_STREAM: TCPの利用
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# ホスト&ポートを指定
sock.bind(('127.0.0.1', 1235))
# キューの数を指定する
sock.listen(1)

while True:
    # 接続の受信を開始
    conn, address = sock.accept()
    try:
        # リクエスト内容を取得
        req = conn.recv(1024).decode()
        print(f"Connection: {address}")
        print(f"Request: {req}")
        # レスポンスする
        conn.send(bytes(f"response {address}", 'utf-8'))
    except:
        print("error")
    finally:
        # 接続を終了
        conn.close()

client.py

クライアント側のソースです。

import socket

def request(req):
    # ソケットオブジェクトの生成
    # socket.AF_INET: IPv4の利用
    # socket.SOCK_STREAM: TCPの利用
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # ホスト&ポートを指定
    sock.connect(('127.0.0.1', 1235))
    # 接続オプション
    # socket.SOL_SOCKET: ソケット通信
    # socket.SO_REUSEADDR: 待ち状態中のポートが存在してもbindする
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    # リクエストする
    sock.send(req.encode("UTF-8"))
    # レスポンス内容を取得
    msg = sock.recv(1024)
    print(msg.decode("utf-8"))

if __name__ == '__main__':
    for i in range(10):
        request(f"request: {i}")

動かしてみる

python server.py

でサーバ側を起動し

python client.py

でリクエストを実施します。

サーバ側では次のように表示されます。

Connection: ('127.0.0.1', 51263)
Request: request: 0
Connection: ('127.0.0.1', 51264)
Request: request: 1
Connection: ('127.0.0.1', 51265)
Request: request: 2
Connection: ('127.0.0.1', 51266)
Request: request: 3
Connection: ('127.0.0.1', 51267)
Request: request: 4
Connection: ('127.0.0.1', 51268)
Request: request: 5
Connection: ('127.0.0.1', 51269)
Request: request: 6
Connection: ('127.0.0.1', 51270)
Request: request: 7
Connection: ('127.0.0.1', 51271)
Request: request: 8
Connection: ('127.0.0.1', 51272)
Request: request: 9

クライアント側では次のように表示されます。

response ('127.0.0.1', 51263)
response ('127.0.0.1', 51264)
response ('127.0.0.1', 51265)
response ('127.0.0.1', 51266)
response ('127.0.0.1', 51267)
response ('127.0.0.1', 51268)
response ('127.0.0.1', 51269)
response ('127.0.0.1', 51270)
response ('127.0.0.1', 51271)
response ('127.0.0.1', 51272)

参考

【Python3】Pythonでソケット通信を試してみた

ソケット

TCPを使う(サーバ、SO_REUSEADDR)

知ったかぶりをしていたソケット通信の基礎を改めて学んでみる

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

    

関連記事

AWS Amplify で コンテナベースのデプロイを行い REST API を構築
検証した環境 やってみる 初期準備 パイプラインを確認 終了処理 参考 AWS Amplify で コンテナベースのデプロイを行い REST API を構築した際のメモです。 検証した環境 amplify 5.1.…

CentOS8 に Python + OpenCV をインストール
インストール テスト CentOS8 で標準で提供されているパッケージで Python + OpenCV 環境を構築する方法です。 検証した環境は CentOS8.3 (Docker) です。 インストール まず opencv…

Python poetryでパッケージ開発 PyPIで公開 Pytestでテスト CIをGitHub Actionsで回す
Poetry でパッケージ開発 pytest でユニットテストを実施しカバレッジを算出する パッケージをビルドし PyPI で公開する 検証環境にデプロイする 本番環境にデプロイする GitHub Actions で CI を回す codecovの設定 GitHub…

CentOS で スマートにプロキシを設定する
コマンドライン上で通す よりスマートに設定する 設定ファイルに記述 CentOSでプロキシを通す設定のメモです。 プロキシ環境で yum/dnf でリポジトリを更新する場合や、curl/wget…

MySQL8.0 で利用できるパラメータを表示する方法
オプションの表示 mysql8.0でmy.cnfなどで利用できるパラメータ一覧を出す方法。 オプションの表示 オプションの表示は次のコマンドで実施できます mysqld — The MySQL Server 【MySQLパラメーター比較資料】MySQL 5.…

CentOS に MySQL8.0をインストールする
はじめに 環境 起動 MySQLインストール my.cnf の設定 プロセス立ち上げ エラー The designated data directory /var/lib/mysql/ is unusable. You can remove all files…

PHP-FPM(php7.4) Apache2.4 on Ubutnu20.04 Webサーバ構築
環境 パッケージの更新 Apache と PHP のインストール Apache のサービスを開始する PHPファイルを作成 参考にしたサイト Ubuntu20.04 に PHP7.4 + Apache2.4 をインストールしてWeb…

UNIXドメインソケット通信 vs INETドメインソケット通信 php-fpmで動作させる場合の違いについて
結論 ソケット通信について ソケットについて ソケット通信の種類 UNIXドメインソケット通信を行う場合のメリット 参考にしたサイト php-fpm の設定方法で調べた際にIPとポートで設定するパターンとUNIX…

homebrew-core is a shallow clone. 対処法
homebrew で homebrew-core is a shallow clone.と 表示されたエラー 対処法 homebrew で homebrew-core is a shallow clone.と homebrewでupdate…

ファイルの1行目を表示 Linuxコマンド head
head コマンド例 headコマンドでファイルの 1行目もしくは指定した行数だけ表示する方法。 head 利用できるオプション コマンド例 の 1行目だけを表示 の 5行目までを表示 カレントディレクトリ以下の全てのtxtファイルの1行目を表示

最新の投稿

Node.js で作成した REST API を Docker化
Node.jsでREST APIを作成 コンテナ化 コンテナ化定義 コンテナ化作業 参考 Node.js で作成した REST API を Docker化した際のメモです。 Node.jsでREST APIを作成 まずはNode.js…

JavaScriptで優先度付きキューを実装する
優先度付きキューについて ソース 参考 JavaScriptで優先度付きキュー (プライオリティキュー) を実装する 優先度付きキューについて 具体的には次のような機能があります。 キューに対して要素を優先度付きで追加 (push…

AWS Amplify で コンテナベースのデプロイを行い REST API を構築
検証した環境 やってみる 初期準備 パイプラインを確認 終了処理 参考 AWS Amplify で コンテナベースのデプロイを行い REST API を構築した際のメモです。 検証した環境 amplify 5.1.…

Pythonでソケット通信を実装しメッセージの送受信を行う
ソース server.py client.py 動かしてみる 参考 Pythonでソケット通信を実現する方法です。 ソース server.py サーバ側のソースです。 client.py…

next_permutationをJSで実装する
ソース 使い方 参考 C++で提供されている順列を生成する next_permutation のJS実装です。 ソース 順列が存在する場合はtrueを返し、そうでなければfalse…

応用情報技術者試験の合格体験記
受験時のステータス 受験結果 対策 スケジュール 午前問題 午後問題 参考書等 令和…

[JS]ラジアンから度数に度数からラジアンに変換する
コード 度数からラジアンへ ラジアンから度数へ サンプル ラジアンから度数に度数からラジアンに変換する際のスニペット。 コード 度数からラジアンへ ラジアンから度数へ サンプル

CentOS8 に Python + OpenCV をインストール
インストール テスト CentOS8 で標準で提供されているパッケージで Python + OpenCV 環境を構築する方法です。 検証した環境は CentOS8.3 (Docker) です。 インストール まず opencv…

[Perl] CentOS8 に plenv をインストール
インストール Step1 事前準備 Step2 PATHを通す (README通りにインストール) Step2 PATHを通す ($HOME以外にplenvをインストール) Step3 Perlインストール Step4 cpanmインストール CentOS…

JS/TSのclassでclass名を取得する
コード JS/TSのconstructorを利用して自分自身のクラス名を取得する際のメモ。 コード このコードの結果は次のようになります。

Tags

Dates

s-yoshiki
s-yoshiki
githubtwitterqiita
Web作ってますが、インタラクティブなプログラミングも好きです。
JavaScript / Vue / node.js / PHP / AWS / OpenCV
© 2021   404 motivation not found