Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
ネットワークプログラミング演習
第15回 振り返り
2019.01.23
今日のお題
振り返り前回のおみくじを例に:
プロトコル(HTTP)
ソケット通信を行うプログラム
2019.01.23
プロトコル(通信規約)
サービスを提供・実行するためにやり取りが必要なメッセージの形式を定めたもの
さまざまなサービスごとにプロトコルが定められている
RFC
新しいサービスを作るとき:そのサービスには、どんな「やり取り」が必要か?
2019.01.23
再掲(第4回)
2019.01.23
プロトコルの階層
通信規約にも階層がある下位の層:IPを使うなら TCP か UDP を使う
上位の層:どのような状況で、どのようなデータをどのような順番で送受信するのか?
Java で TCP を使うとして…byte の配列を送受信することはできる(ね?)
InputStream, OutputStream
伝えたい情報はどのようなものか
その情報を、どのように byte の配列で表現するか?
byte の配列からどうやって元の情報に戻すか?
再掲(第4回)
HTTP リクエストの構成
Hyper Text Transfer Protocol
リクエスト:ブラウザからサーバへの要求
2019.01.23
リクエスト行
ヘッダ
ボディ
GET や POST など。1行に書く。
host は必須。Cookie などを書く。複数行書くことができる
ヘッダとボディの間に空行を1行入れる
POSTをリクエストする際の名前と値のペアなど。
※)改行は \r\n で表す。
HTTP リクエスト:リクエスト行
例)GET /prof/yamagu/2018NP/omikuji.php HTTP/1.1
2019.01.23
GET リクエストであることを示す
要求するファイルの所在
プロトコルバージョン
ソケット
他のプロセスと通信するときの「口」
TCP/IP や UDP/IP はソケットを介して使うことができる ローカルのファイル経由で通信するときにも使える(UNIXドメインソケットという)
インターネットドメインのソケットを使う際には、あらかじめホストマシンの情報(IPアドレス)が必要
2019.01.23
再掲(第2回)
ソケットの使い方
サーバ側
1. ソケットを用意するsocket を呼ぶ
ファイルデスクリプタが得られる
2. 名前を対応付ける
bind を呼ぶ
ポート番号と対応付く
3. 接続を待つ
listen を呼ぶ
4. 接続を受け付けるaccept を呼ぶ
ファイルデスクリプタが得られる
2019.01.23
クライアント側
1. ソケットを用意する
socket を呼ぶ
ファイルデスクリプタが得られる
2. サーバに接続する
connect を呼ぶ
再掲(第2回)C言語の場合
サンプルプログラムの解説(Client)
Socket クラス
new で作れば connect してくれる
2019.01.23
再掲(第3回)
Javaの場合
今日のサンプルプログラムimport java.io.*;
import java.net.*;
public class CheatClient {
final static String HOST = "sun.ac.jp";
final static int PORT = 80;
public static void main(String args[]) {
try {
Socket sock = new Socket(InetAddress.getByName(HOST),PORT);
InputStream in = sock.getInputStream();
OutputStream out = sock.getOutputStream();
out.write(("GET /prof/yamagu/2018NP/omikuji3.php HTTP/1.1\r\n"+
"Host: sun.ac.jp\r\n"+
"Cookie: omikuji3=UUlKZ3ora2lzWlBlTjE1RUQyNnEyUT09\r\n"+
"\r\n").getBytes());
byte message[] = new byte[1000];
int len;
while( (len=in.read(message)) > 0) {
System.out.write(message,0,len);
}
in.close();
out.close();
sock.close();
}catch( IOException e ) {
e.printStackTrace();
System.exit(1);
}
}
}2019.01.23
山口のおみくじプログラムにCookie を送り付けて大吉を
出させるプログラム
CheatClient.java
サンプルプログラム解説 1/6
import java.io.*;
import java.net.*;
public class CheatClient {
・ ・ ・
}
2019.01.23
入出力に関連するクラスを使う
ネットワーク関連のクラスを使う
クラスの名前を CheatClient とする
サンプルプログラム解説 2/6
final static String HOST = "sun.ac.jp";
final static int PORT = 80;
public static void main(String args[]) {
try {
・ ・ ・
}catch( IOException e ) {
e.printStackTrace();
System.exit(1);
}
}
2019.01.23
接続先のホスト名。定数として定義している
接続先のポート番号。HTTP は 80番
ネットワークや入出力を使うと、例外が発生する可能性があるので、捕捉するようにしておく
例外が発生したら、スタックトレースを表示して終了する
サンプルプログラム解説 3/6
Socket sock = new Socket(InetAddress.getByName(HOST),PORT);
InputStream in = sock.getInputStream();
OutputStream out = sock.getOutputStream();
2019.01.23
ソケットを作って、connect する受信用に、ソケットから
読みこむためのInputStream
を準備する
送信用に、ソケットへ書き込むためのOutputStream を準備する
サンプルプログラム解説 4/6
out.write(("GET /prof/yamagu/2018NP/omikuji3.php HTTP/1.1\r\n"+
"Host: sun.ac.jp\r\n"+
"Cookie: omikuji3=UUlKZ3ora2lzWlBlTjE1RUQyNnEyUT09\r\n"+
"\r\n").getBytes());
2019.01.23
HTTP リクエストを送信する
ヘッダにCookieを含めるヘッダとボディの間の空行。ボディは無し。
サンプルプログラム解説 5/6
byte message[] = new byte[1000];
int len;
while( (len=in.read(message)) > 0) {
System.out.write(message,0,len);
}
2019.01.23
サーバから受信した応答を標準出力にそのまま出力 情報を受け取る
記憶領域を準備
情報がある限り、受け取る繰り返し
受け取った情報をそのまま出力
サンプルプログラム解説 6/6
in.close();
out.close();
sock.close();
2019.01.23
InputStream を閉じる
OutputStream を閉じる
Socket を閉じる
注意事項
今日のサンプルプログラムは
(単純な通信プログラムですが)、
セッションハイジャックなどに使われる手口と類似のものです。
絶対に悪用しないでください。
2019.01.23
まとめ
通信するソフトウェアが扱う概念の階層
通信するプログラム
Socket
プロトコル
Web上のプログラミング
クライアントで動くプログラム
サーバで動くプログラム
…ネットワークを使うプログラムの下位層から上位層まで概観した
2019.01.23
余談
技術者や研究者になろうとしている人たちへ:
仕組みを知ってください
仕組み:
下位層の技術をどう使ってできているか
情報技術のいろいろな階層にプログラミングが現れます。プログラムは仕組みを表現したものです。プログラムの読み書きを忘れないで。
2019.01.23
授業アンケートにご協力ください
記入後、専用ポストに投函してください。
2019.01.23
回答は個人を特定されないように、氏名・学年・学籍番号を伏せた上で、教員にフィードバックされます。