太子プログラミングクラブ中級第1期(2026年2月)~IPアドレスで通信する~

太子プログラミングクラブは、2月から双方向通信をするプログラムに取り組みます。まずは、基本中の基本IPアドレスとはなんぞやというところからスタートです。

タイピングが出来ないと話にならない

中級になると、今まで以上にキー入力が増えます。キー入力はプログラミングでもAI活用でも肝心要です。初級3期を終えたメンバーも、もう一度タイピングを見直します。

偉そうに腕組みして見ていますが、これは「敵わないなあ」と肝念して見ているところです。私のベストスコアは、220字/分くらいです。自慢ですが、結構速い方です。

写真のメンバーは、このときで260字/分くらい。ベストは280字/分だそうです。1年少しくらいで抜かれました。もう敵いません。

クラブ全体を通して、すでに二人が私のベストスコアを超えました。さあ、3人目は誰だ!?

IPアドレスの取得から

パソコン同士で通信するには、自分のパソコンのIPアドレスを知らないと始まりません。まずはコマンドを打ってIPアドレスの確認をするところからです。今回は使いませんが、ついでにホストネームの確認もします。

$ipconfig
$hostname

下の写真のように、小学生のメンバーでも黒い画面でゴリゴリコマンドを打たせるのが私たちのクラブの方針です。

『牢獄の庭を歩く自由よりも、嵐の海だがどこまでも泳げる自由を、私なら選ぶ!』(沈黙の艦隊より)

某漫画の一節で、私の好きな言葉です。出来合いの教材ではなく、世の中の普通のツールを使うのはしんどいと思います。しかし、実際に使えてなんぼのこの世界、大人と同じ、またはそれ以上の力をつけてもらうためです。

受信プログラムと送信プログラム

IPアドレスが分かったら、受信するプログラムと送信するプログラムを書きます。

import socket

# 相手のIPアドレスを入力
target_ip = "相手のIPアドレス"

# サーバーに接続
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((target_ip, 12345))

print(f"{target_ip} に接続しました!")

# メッセージを送信
message = "相手に向けてメッセージを書く"
client.send(message.encode('utf-8'))

print("メッセージを送信しました!")

# 終了
client.close()
import socket

# サーバーの設定
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('0.0.0.0', 12345))  
server.listen(1)

print("メッセージ待機中...")
print("相手が接続してくるまで待ちます")

# クライアントからの接続を待つ
client, address = server.accept()
print(f"{address} から接続されました!")

# メッセージを受信
message = client.recv(1024).decode('utf-8')
print(f"受信メッセージ: {message}")

# 終了
client.close()
server.close()

中級のメンバーは、これくらいのコードならあっという間に書いてしまいます。そして、驚くほどタイプミスが少ないのです。もっと言えば、エラーコードを読んで自分たちで修正してしまいます。

メンバーはよくできるがスタッフがポンコツだった

本日の私のミスと不運。

  • HDMIケーブルを忘れました。大画面が使えませんでした。
  • ルーターの設定を変更していませんでした。ノード相互の通信ができませんでした。
  • 部屋のコンセント電源がブレーカートリップしているのに気づくのが遅く、準備がすべて後手になりました。

申し訳ありませんでした。

もちろんリカバリーはしました。一部期待通りに動いたパソコンを全員に見てもらいました。

Pythonドリルもつけています

私はトラブル対応しながら、メンバーにはPythonドリルをしてもらいます。

完成された教材・機材を使っているわけではないので、いつだってトラブルはつきものです。しかしながら、トラブル時でもメンバーが自分たちで進められる教材を用意しています。

また、私の背中を見て、これが現実ということをメンバーには理解してほしいと思います。バグもトラブルもないコンピューターなんて存在しないので。

かんたんなメッセージ送受信プログラム

送受信できることを確認したら、今度は双方向でメッセージをやり取りするプログラムを書きます。

今度は自分でIPアドレスの確認から。

ついでに、TCP/IP通信の仕組みをごく簡単に説明しました。詳しい通信仕様はどうでもいいので、まずはなんとなく概要を掴むことが大切です。

続いてポートの設定。これを全員まとめてしてしまいましょう。ところが、画面がみんな違うのが頭の痛いところです。前で説明した通りの画面にならないので、最後はメンバー全員の画面を見ながら設定を完了します。サポートセンターは大変だー。

サーバー側とクライアント側のプログラムを写経

設定が終わったところで、クライアント側とサーバー側のプログラムをそれぞれ写経します。

プログラムは下記。

import socket
import threading

# サーバーの設定
HOST = '127.0.0.1'
PORT = 12345

# クライアントソケットを作成
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((HOST, PORT))
print(f"サーバーに接続しました")

# メッセージ受信用の関数
def receive():
    while True:
        try:
            message = client.recv(1024).decode('utf-8')
            if message:
                print(f"サーバー: {message}")
        except:
            break

# 受信を別スレッドで実行
thread = threading.Thread(target=receive)
thread.start()

# メッセージ送信
while True:
    message = input()
    client.send(message.encode('utf-8'))
    if message == "bye":
        break

client.close()
import socket
import threading

# サーバーの設定
HOST = '127.0.0.1'
PORT = 12345

# サーバーソケットを作成
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((HOST, PORT))
server.listen(1)

print(f"サーバー起動中... {HOST}:{PORT}")
client, address = server.accept()
print(f"接続されました: {address}")

# メッセージ受信用の関数
def receive():
    while True:
        try:
            message = client.recv(1024).decode('utf-8')
            if message:
                print(f"クライアント: {message}")
        except:
            break

# 受信を別スレッドで実行
thread = threading.Thread(target=receive)
thread.start()

# メッセージ送信
while True:
    message = input()
    client.send(message.encode('utf-8'))
    if message == "bye":
        break

client.close()
server.close()

入力は速いもので、40分くらいでだいたい入力が済んでいるのが素晴らしい

ただ、動作確認がうまく行かず。全員はじめの接続までは動いたけれど、メッセージの往復は出来ませんでした。これは3月に持ち越します。

画面で何かが動くコードではなく、通信は目に見えないやり取りがコードに書かれています。これまで取り組んできたプログラムより、コードは短くても難易度が高いのでしょう。私もやり方を工夫しながら進めます。