lecture:apro:2021:ex1

高橋先生担当の前半に引き続き、後半でもプログラミング言語として Python を用います。

Python のプログラミング環境は、(前半第1回のSetup)を前提とします。 それ以外の Python 環境を利用している人は、演習内容や説明を自分の環境に合わせて適宜読み替えてください。 ただし、後半では Python でのネットワーク通信を行うので、Paiza.io などのオンライン・プログラミング環境は利用できませんので注意してください。

演習では、毎回の演習ページで指示された内容を順に取り組んでください。基本的には、自分自身でプログラムの実行結果や内容を確認しながら演習を進めます。

幾つかの演習課題では、このような色付き枠が表示されています。 これらは、TAによるチェック課題です。 TAによるチェック課題が完了した時点で、Teams による TA予約を行ってTAチェックを受けて下さい。 TAチェックを通過すれば、その課題は提出済みとして記録されます。

TAチェックの際、TAから幾つかの質問が行われる場合があります。課題が完了していても、これらのTAからの質問に答えられない場合は提出として認められません。 そのような場合は、課題の内容を理解し直してから再度TAチェックを受けて下さい。

また、このような色付き枠が表示されている課題もTAによるチェック課題ですが、提出は必須ではありません。 余裕のある人や興味のある人は取り組んで、TAチェックを受けてください。こちらの課題に対する可否は、原則として科目の評価には入りません。

この科目では、オンラインでの講義配信やスライド・PC画面提示、演習中のTAによる課題チェックや質問の予約に Microsoft Teams を利用します。

一般チャネル:科目全般に関するお知らせ

科目全般に関する教員からのお知らせや各種アナウンスを投稿します。

各回演習用チャネル(☆ ex01-1125 など): 各回の講義パートの会議やアナウンス

演習回は後半のみの通し番号で ex01 から始まります。後半のチャネル名は前半と区別するため、先頭に星マーク(★/☆)が付いています。 開始時間になったら、まずはこちらのチャネルで開催される会議(オンラインの講義パート)に参加し、その後、指示に従って演習を進めて下さい。

各回用の質問チャネル(☆ ex01-質問チャネル など):各回の演習内容に関する質問

全般的な質問用チャネル:各回の内容によらない全般的な質問

講義や演習時間中であるかどうかに関わらず、いつでも質問を投げることが可能です。質問へは、教員、またはTAがオンラインで対応します。

各回の演習内容に関する質問は「☆ ex01-質問チャネル」などへ、科目全般に関する質問は「★ 全般的な質問用」チャネルに投稿して下さい。

これらのチャネルへ投稿された質問と回答は、この科目チーム全体に共有されます。 他の受講生にも有益と思われる質問投稿には、教員から「いいね」マークが付き、評価加点の対象となります。

必ずこの科目での質問方法に従って質問を投げて下さい。チャットでの直接質問や「悪い質問の例」のような質問には返答されないことがあります。

TAチェック予約用チャネル(☆ ex01-TAcheck など): 演習中のTA予約用

この科目の演習課題には、TAによるチェックが指示されているものがあります。 TAチェックを受ける場合は、このTAチェック予約用チャネルでTA予約をして下さい。 TAチェック予約の利用方法は、

  1. TAチェック予約チャネルに、「チェックを希望する課題番号」を投稿します。
  2. 自分の投稿に TA からの返信があったら、その返信元の TA の指示に従って下さい。
  3. 対応を受けた投稿には 対応したTAからの「いいね」マークが付き、対応が受け付けられたことがマークされます。

となります。原則として、予約受付順に対応を行いますが、課題番号によっては予約順とTA対応の順が前後することがあります。

以下の 1-1. から 1-3. にしたがって、自分のPCのネットワーク環境を調べなさい。

1-1.PCのIPアドレスとネットワークマスクを調べる

  1. ipconfig/ifconfig/ip コマンドを使って、自分のPCのIPアドレスネットワークマスクの値を調べなさい。

1-2.PCのホスト名を調べる

  1. hostname コマンドを使って、自分の計算機のホスト名を調べなさい。
  2. ホスト名はPCの管理者権限を持っていれば自由に設定できますが、DNSデータベースに登録されていない限りインターネット(TCP/IPネットワーク)上でその名前を使ってアクセスすることは出来ません。ローカルネットワーク内ではDNSに未登録のホスト名が利用可能なケースもあります。

1-3.DNSサーバにアクセスしてホスト情報(IPアドレス ⇔ ドメイン名)を調べる

  1. nslookup/host コマンドを使って、ドメイン名 www.ryukoku.ac.jp の(DNSに登録されている)IPアドレスを調べなさい。
  2. nslookup/host コマンドを使って、IPアドレス 133.83.80.10 の(DNSに登録されている)ドメイン名を調べなさい。

2-1. 実行ファイルの準備

  1. 以下の2つの Pythonコード echoServer.pyechoClient.py をダウンロードし(下記のソースコードのファイル名をクリックするとダウンロードできます)、自分のPCの適当な場所に保存しなさい。
  2. コピーした2つのソースファイルを Visual Studio Code などのエディタで開いて、ファイルの内容を確認しなさい。
echoServer.py
# Echo server program
import socket
 
HOST = ''                 # サーバホスト名('' とすると実行マシン上の接続可能な全てのホスト名)
PORT = 50007              # サーバポート番号
 
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data: break
            print('Received', repr(data))
            conn.sendall(data)
            print('Send', repr(data))
echoClient.py
# Echo client program
import socket
 
HOST = 'localhost'        # リモート(サーバ)ホスト名
PORT = 50007              # リモート(サーバ)ホストのポート番号
 
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    send= b'Hello, world'
    s.sendall(send)
    print('Send', repr(send))
    data = s.recv(1024)
    print('Received', repr(data))

2-2. 同じPC上で(自分自身と)の通信

  • echoServer の起動
    1. ターミナル(シェル)を起動します。
    2. 起動したターミナル上で、次のように Pythonコードとして echoServer を起動します。
      $ python3 echoServer.py
  • echoClient の起動(と通信)
    1. echoServer を実行したものとは別のターミナル(シェル)を新たに起動します。
    2. ターミナルから次のように echoClient を実行します。
      $ python3 echoClient.py

クライアントプログラム echoServer.py がサーバプログラム echoServer.py との通信に成功すれば以下のように表示されます。

Send b'Hello, world'
Received b'Hello, world'

通信が成功した場合は、echoServer を実行したターミナル上にも受信された文字列が表示されているはずです。

ネットワーク上で送受信される文字列などのデータは バイト型 と呼ばれるデータ型として扱われます。 Python での文字列に対応するバイト型のデータは、文字列 'Hello, world' に対して、その先頭に b を付けた b'Hello, world' のように表現することができます。 ネットワーク上で送受信するデータは、基本的にこのバイト型として表現します。バイト型については、この科目でも次回以降に改めて扱います。

実習室 Ubuntu Linux リモート接続環境 を参考にして、TAチェックのためのリモート実習環境にログインしなさい。動作確認必要な Pythonコードなどは、scp コマンドを利用して各自でリモート自習環境にコピーしてください。

リモート実習環境 rp-linux 上で Python コマンドは、python3 であることに注意。

4-1. rp-linux 環境での異なるPC間の通信

  1. echoClient.py の接続先(リモートホスト名)を、IPアドレス 133.83.80.110 に変更しなさい。IPアドレスは文字列として定義することに注意。
  2. 自分の計算機(のターミナル)上で実行された echoClient.py が、指定された計算機 133.83.80.110 の echoServer.py と通信できることを確認しなさい。
  3. 133.83.80.110 で実行されている echoServer.py の実行結果は、Teams 上の会議で常時表示しておきます。

4-2. 送受信する文字列の変更

TAチェック課題です。4-2-a. と 4-2-b. の準備ができたらTAチェックの予約を行い、両方の課題チェックをまとめて受けてください。

4-2-a. クライアントからの送信文字列の変更
  1. echoClient.py を修正し、送信文字列 'Hello, world' の代わりに、自分の学籍番号とアルファベット氏名を含んだ適当な文字列を送る msgClient.py を作成しなさい。
  2. TAの指定するサーバーに msgClient.py を用いて接続し、変更した文字列データを送信しなさい。
4-2-b. サーバからの返信文字列の変更
  1. クライアントプログラムから受け取った文字列をそのまま送り返すだけであった echoServer.py を修正し、「受け取った文字列」と「自分の学籍番号」の両方を含んだ適当な文字列を返信する replyServer.py を作成しなさい。
  2. echoClient.py と replyServer.py の間で送受信を行い、その動作を確認しなさい。
  3. replyServer.py を起動しなさい。そのサーバプログラム replyServer.py への接続に必要な情報をTAに伝え、TAのクライアントプログラムからの通信に自分の replyServer.py が条件通りに返信できることを確認しなさい。
送受信に用いる文字列はすべてバイト型として、通常の文字列の前に b を付けて宣言して下さい(例:b'Hello World')。バイト型については後半第2回で解説します。

4-3. 繰り返しの送受信(おまけ課題:余裕のある人は取り組んで下さい)

  1. 今回実行した echoServer.py は、echoClient.py との通信を1回行うごとにプログラムの実行を終了している。echoServer.py を修正し、1つの echoClient.py との送受信を完了してもプログラムを終了せず、再び、次の echoClient.py との通信を行うことができるようなサーバプログラム echoServer-ex.py を作成しなさい。
  2. echoServer-ex.py を起動し、そのサーバへの接続に必要な情報をTAに伝えなさい。echoServer-ex.py の一度の起動で、TAのクライアントプログラムからの複数回の接続を継続して繰り返し処理できることを確認しなさい。
  • lecture/apro/2021/ex1.txt
  • 最終更新: 2021/11/25 10:27
  • by sano