6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【TCP通信】TCPでJSONを返す!簡易サーバーをSocketDebuggerで作ってみた

Posted at

1. はじめに

最近では、JSON形式でデータをやりとりするのが当たり前になってきました。
APIの世界でも、スマホアプリでも、IoT機器との通信でも、JSONは大活躍しています。

でも、「ちょっとだけJSONサーバーを作って試したい🤔」と思ったとき、意外と面倒な準備が必要だったりしませんか?

そこで今回はSocketDebuggerを使ってサクッとTCPの簡易JSONサーバーを作ってみます!

image.png
イラスト:ChatGPT(OpenAI)による生成画像


JSONの概要ついては以下の記事で簡単におさらいできます。


SocketDebuggerとは?という方は、まずはこちらをご参照ください。

2. 簡易JSONサーバーはこんな時に便利!

  • 開発中のクライアントアプリが正しく送信しているか確認したい💻
  • ローカル環境で簡易的なIoT機器の通信テストをしたい🛜
  • JSONのやり取りを模擬したいが、サーバーを毎回立てるのが面倒💦

3. 簡易JSONサーバー仕様

簡易JSONサーバーは仮想IoT機器として、クライアントアプリからの要求に対して以下を応答するように設定します。

要求コード 応答データ(JSON) データ概要
0001 {"status": "OK", "user_id": 101,"token": "abc123"} ユーザーデータ
0002 {"status": "OK", "battery": 80, "temperature": 26.0} バッテリー状態
0003 {"status": "OK", "message": "Open the Door"} 制御メッセージ
上記以外 {"status": "NG", "errcode": "E002"} エラーコード

4. 簡易JSONサーバー設定

4-1. SocketDebuggerを起動します。

4-2. メニューの[設定]から[通信設定]をクリックします。
image.png

4-3. 左の項目ペインの[接続]-[ポート1]をクリックし、赤枠内を以下のように設定します。

項目 設定値
このポートを使用する チェック有
通信タイプ TCPサーバ
localポート番号 1024

image.png

4-4. 左の項目ペインの[動作]-[ポート1]をクリックし、「スクリプト制御を行う」にチェックを入れ設定します。最後に「OK」をクリックします。
image.png

4-5. スクリプトエディタ(スクリプト1)内の受信通知関数に以下の赤枠内の処理を追記してください。(事前にメニューの[表示]から[スクリプト(1)]を選択状態にする)
image.png

Luaスクリプト
---------------------------------------------
-- 受信通知
---------------------------------------------
function OnReceive(recv)
    Logput(1,'OnReceive')
    --追記する(ここから)
    --要求に応じたJSON形式データを送信する
    str = string.char(unpack(recv))
    if str == "0001" then
       SendData("{¥"status¥": ¥"OK¥", ¥"user_id¥": 101, ¥"token¥": ¥"abc123¥"}")
    elseif str == "0002" then
       SendData("{¥"status¥": ¥"OK¥", ¥"battery¥": 80, ¥"temperature¥": 26.0}")
    elseif str == "0003" then
       SendData("{¥"status¥": ¥"OK¥", ¥"message¥": ¥"Open the Door¥"}")
    else
       SendData("{¥"status¥": ¥"NG¥", ¥"errcode¥": ¥"E002¥"}")
    end
    --(ここまで)
    return 0
end

警告
LuaスクリプトでJSONのダブルクォーテーション(")を表現する場合、エスケープシーケンスが必要です。
(「"」を表現する場合「¥"」と記述する。)


4-6. ポート1の通信を開始し、クライアントアプリからの接続要求を待ちます。
image.png

5. クライアントアプリ仕様

簡易JSONサーバーに要求コード「0001」~「0004」を送信し、応答で受信したデータを表示します。

tcp_client.py
import socket
import time
import json

def is_valid_json(data):
    try:
        json.loads(data)
        return True
    except:
        return False

def main():
    print("=== TCPクライアント ===")
    server_ip = input("サーバーIP (例: localhost): ")
    server_port = int(input("ポート番号 (例: 8080): "))
    
    send_data_list = ["0001", "0002", "0003", "0004"]
    
    try:
        # TCPソケットの作成
        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        
        # サーバーに接続
        print(f"\n{server_ip}:{server_port} に接続中...")
        client_socket.connect((server_ip, server_port))
        print("接続成功!\n")
        
        # データを順番に送信
        for i, data in enumerate(send_data_list, 1):
            # 現在時刻を取得
            current_time = time.strftime("%H:%M:%S")
            
            # データを送信
            print(f"[{current_time}] 送信 ({i}/4): {data}")
            client_socket.send(data.encode('utf-8'))
            
            # サーバーからの応答を受信
            response = client_socket.recv(1024).decode('utf-8')
            print(f"[{current_time}] 応答: {response}")
            
            # JSON判定
            if is_valid_json(response):
                print(f"[{current_time}] JSON判定: 有効なJSON")
            else:
                print(f"[{current_time}] JSON判定: 無効なJSON")
            
            print("-" * 40)
            
            # 最後のデータでなければ2秒待機
            if i < len(send_data_list):
                print("2秒待機中...\n")
                time.sleep(2)
        
        print("全データの送信が完了しました。")
        
    except ConnectionRefusedError:
        print("エラー: サーバーに接続できませんでした。")
    except Exception as e:
        print(f"エラーが発生しました: {e}")
    
    finally:
        # ソケットを閉じる
        try:
            client_socket.close()
            print("接続を終了しました。")
        except:
            pass

if __name__ == "__main__":
    main()

6. 動作検証

さっそくクライアントアプリを実行すると…

クライアントソフト実行
=== TCPクライアント ===
サーバーIP (例: localhost): 172.17.50.162
ポート番号 (例: 8080): 1024

172.17.50.162:1024 に接続中...
接続成功!

[09:34:10] 送信 (1/4): 0001
[09:34:10] 応答: {"status": "OK", "user_id": 101, "token": "abc123"}
[09:34:10] JSON判定: 有効なJSON
----------------------------------------
2秒待機中...

[09:34:12] 送信 (2/4): 0002
[09:34:12] 応答: {"status": "OK", "battery": 80, "temperature": 26.0}
[09:34:12] JSON判定: 有効なJSON
----------------------------------------
2秒待機中...

[09:34:14] 送信 (3/4): 0003
[09:34:14] 応答: {"status": "OK", "message": "Open the Door"}
[09:34:14] JSON判定: 有効なJSON
----------------------------------------
2秒待機中...

[09:34:16] 送信 (4/4): 0004
[09:34:16] 応答: {"status": "NG", "errcode": "E002"}
[09:34:16] JSON判定: 有効なJSON
----------------------------------------
全データの送信が完了しました。
接続を終了しました。

期待通りに簡易JSONサーバーから、各要求コードに応じたJSONデータが返ってきています!😄

簡易JSONサーバー側のログでも、仕様通りになっていることを確認できます。
image.png

動作環境
ローカル環境での動作検証のため、クライアントアプリと簡易JSONサーバーは同一PC内で起動しています。

8. まとめ

今回は、お手軽に簡易JSONサーバーを構築する方法を紹介しました。
SocketDebuggerを簡易JSONサーバーにすることで、アプリケーション開発における通信確認の手間を大幅に削減できます👍

また、Luaスクリプトのif文による条件分岐を組み込むことで、柔軟な制御も可能になることがわかりました📝
Luaスクリプトを活用し、皆さんの開発の手助けになるようなオリジナルの「〇〇サーバー」の構築を試してみてください!

記事リンク

株式会社ユードム

株式会社ユードムはITと人間力で社会に貢献します。

SocketDebuggerのご購入はこちら(期間限定の試用版もあります)
https://www.udom.co.jp/sdg/index.html

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?