Network Programming

Networked Programming
and HTTP/Web
目次







ネットワークプログラミングの基礎
Webサーバの概要・構成
Telnet (クライアントの動作, 2台間通信,
Javaプログラムの実装)
FTP (概要, アクセス動作,
Javaプログラムの実装)
チャットプログラム (Javaプログラムの実装,
マルチキャスト)
P2P通信 - JXTA
ネットワークプログラムを利用した研究
Webサーバとは
wwwシステムにおいて、情報送信を行うコンピュー
タ、wwwによる情報送信機能を持ったソフトウェ
アのこと。
クライアントであるウェブブラウザのURLにて指示
された、Webサーバ内に存在するHTMLドキュメン
トの各種動作をクライアントから接続されたHTTP
に則ったTCP/IPソケットストリーム(HTTPコネク
ション)に送信する。
Webサーバの構成
馬研究室のサーバの例
 IPアドレス:133.25.82.142
 ドメイン名:www.malab3.k.hosei.ac.jp
 サーバ用ソフトウェア:
Apache HTTP Server 2.2.10
/ Apache Tomcat 6.0 (Web公開・Java Servret 用)
IP(Internet Protocol)とは?
⇒IPアドレスを用いてネットワーク上のPCの位置を
表すもの
DNSとは?
⇒ドメイン名とIPアドレスを関連付けるシステム
ポート番号とは
通信のサービスを特定するための番号。
No
Protocol
サービス
20
ftp-data
ファイル転送(データ本体)
21
ftp
ファイル転送(コントロール)
22
ssh
シェル:SSH(セキュア)
23
telnet
シェル:telnet
25
smtp
メール送受信:SMTP
53
domein
DNS
80
http
WWW
110
pop3
メール受信(POP)
上記はよく利用されるポート番号とプロトコル。
上のように、サービスによってデータの送受信の受け口が分かれている。
ネットワークのレイヤー
ネットワークは各層に分かれ、データの送受信を行う。
HTTP
HTMLファイルの送受信に関する役割
TCP
データを過不足なく送り届ける役割
IP
データを特定のPCへ送り届ける役割
→各層に役割を分担することで拡張性
や保守性を高めている
ソケットとは?
⇒IP部分とポート番号を組み合わせたネットワークア
ドレスのこと
法政大学 情報科学研究科 川島友美
TCP/IPまとめ
宛名等 宛先等
内容 宛名等
内容
HTTP/1.1
(GET index.html
200 OK
宛先ポート:80
宛先:192.168.1.20
宛先:www.yahoo.co.jp
宛先ポート:80
宛先ポート:3000
HTTP/1.1
(GET宛先ポート:3000
index.html
200
OK
HTTP1.1)
自分ポート:3000
自分ポート:80
自分:192.168.1.20
自分:www.yahoo.co.jp
<HTML>・・・
自分ポート:3000
自分ポート:80
HTTP1.1)
<HTML>・・・
HTTP
TCP
HTTP
IP
TCP
HTTP
宛名等
内容
HTTP/1.1
(GET index.html
200 OK
宛先ポート:80
宛先ポート:3000
HTTP1.1)
自分ポート:3000
自分ポート:80
<HTML>・・・
TCP
内容
HTTP/1.1
(GET index.html
200 OK
HTTP1.1)
<HTML>・・・
内容
HTTP/1.1
(GET index.html
200 OK
HTTP1.1)
<HTML>・・・
HTTP
HTTP
WEBサーバの待ち受けポート番号は80
世界中で統一されている
FTPは21、POPは110等々
送信元のポート番号はWindowsが
空いているポートを勝手に選択する
法政大学
情報科学研究科
川島友美
クライアントプログラム - telnet
telnetで簡易クライアントを確認する。
■以下のコマンドを実行
% telnet www.cs.gunma-u.ac.jp 80
Trying 133.8.2.7... Connected to
www.cs.gunma-u.ac.jp. Escape
character is '^]'.
GET /index.html HTTP/1.0
2台間での通信 - telnet
telnetコマンドを用いて通信の確認を行
う。
■以下のコマンドを実行
>>telnet
>>192.168.**.**
(local 環境)
>> User, Passwordを入力
ローカル環境下で接続が確立しているのを確認
JavaによるTelnetプログラムの実現
双方向のTCPコネクションを扱うクラ
イアントプログラムを作成する。
TCPコネクションを開いて、コネク
ションと標準入出力を接続する。ネッ
トワーク側と標準入力側からの入力を、
それぞれ反対側の出力に接続すればよ
い。
(※実際にプログラムを動かして解説)
JavaによるTelnetプログラムの実現 – Program内での動き
Class TelnetTest
>int HTTP_port = 80;
>String host = “www.cs.gunma-u.ac.jp";
使用するポートを80に、接続先のhost名を入力する。
>PrintWriter netOut = null;
>BufferedReader netIn = null;
入出力ストリームの宣言
>Socket http = new Socket(host,HTTP_port);
>netIn = new BufferedReader(
>new InputStreamReader(http.getInputStream(),"EUC_JP"));
>netOut = new PrintWriter(http.getOutputStream());
入出力ストリームの生成とソケットへの結びつけを行う。
>System.out.println("HTTPサーバ("+host+")に接続...");
>netOut.print("GET /index.html HTTP/1.0");
>netOut.print("Host: " + host + "\n");
>netOut.print("\r\n\r\n");
>netOut.flush();
HTTPプロトコルに従った文字列の送受信を行う。
FTP (ファイル転送用プロトコル)
■FTP(File Transfer Protocol)
Telnetと同様にインターネット上で広く使わ
れている、2台のコンピュータ間でファイル
を転送するためのプロトコル。
TCP/IPの上のプロトコルで、通常21番ポート
と20番ポートを使用してアクセス。
FTP – アクセスの確認 (1)
コマンドプロンプト(FTP.EXE)からFTPサーバ
にアクセスする。
>>ftp -d “host_name or IP Address”
(-d を付けることにより、サーバへのクライアントから
の送信コマンドなどが表示される。)
ftp>user: ******
ftp>password:**********
接続が確立されるのを確認。
ftp>ls
//一覧表示
-->PORT ***,***,*,**,*,**
200 Data port connected.
-->NLST
150 Sending file list.
(一覧が表示される)
FTP – アクセスの確認 (2) get, put
ftp> get “file_name”
-->PORT ***,***,*,**,*,**
200 Data port connected.
-->RETR test.txt
150 ASCII file D:/test.txt ready to send
226 Transfer finished successfully.
ftp> put”file_name”
-->PORT ***,***,*,**,*,**
200 Data port connected.
-->STOR test.txt
150 File D:/test.txt start to receive.
226 Transfer finished successfully.
JavaによるFTPプログラムの実現 (1)
FTPのためのプログラムには、以下の3
点が必要。
■制御用コネクション
■データ転送用コネクション
■ファイルの受渡しを実装する
JavaによるFTPプログラムの実現 (2)
//制御用のポートなので、21番を指定する
final int CTRLPORT = 21;
//ソケットと入出力ストリームの関連付け・コネクションの開閉
public void openConnection(String host) throws IOException, UnknownHostException{
ctrlSocket = new Socket(host,CTRLPORT);
ctrlOutput = new PrintWriter(ctrlSocket.getOutputStream());
ctrlInput = new BufferedReader(new InputStreamReader(ctrlSocket.getInputStream()));
}
public void closeConnection() throws IOException{
ctrlSocket.close();
}
//Login 動作
ログイン名とpasswordをサーバへの送信
System.out.println("login name:");
LoginName = Lineread.readLine();
ctrlOutput.println("USER " + LoginName);
ctrlOutput.flush();
System.out.println("password:");
password = Lineread.readLine();
ctrlOutput.println("PASS " + password);
ctrlOutput.flush();
JavaによるFTPプログラムの実現 (3)
ls, get, putコマンドに対応してプログラムを作成。
dataConnectionメソッドを用いて、ファイルの受け渡
しを可能とする。
各コマンドに対してはそれぞれ、doLS(), doGet(),
doPut() が対応している。
⇒ ソースを見ながら解説
プログラムでメッセージの送受信(1)
最も簡単なメッセージ送信の例を考える。
プログラム実装のための手順は以下の通り。
受信側(サーバ)と送信側(クライアン
ト)を確立する。
 ソケット通信を確立する。
 メッセージの送受信をする。

プログラムでメッセージの送受信(2)
ローカル環境でメッセージの送受信のテストを行う

サーバ側
aSocket = new ServerSocket(6000);
aSocket.setSoTimeout(0);
aClient = aSocket.accept();
InputStream inStream =
aClient.getInputStream();
len = inStream.read(buf);
System.out.print(new String(buf,0,len));
aSocket.close();

クライアント側
byte buf[] = new byte[256];
int len;
BufferedReader lineread = new
BufferedReader(new
InputStreamReader(System.in));
System.out.println("IP Address:");
line = lineread.readLine();
ip = InetAddress.getByName(line);
clientSocket = new
Socket(ip,PORT_NUMBER);
OutputStream outStream =
clientSocket.getOutputStream();
System.out.println("message>");
len = System.in.read(buf);
if(clientSocket.isConnected())
outStream.write(buf,0,len);
clientSocket.close();
チャットプログラムの実現(1)
TCPコネクションによるチャットサーバを構築し、サーバ・ク
ライアント型でのチャットシステムを構築する。
チャットプログラムの実現(2) – サーバ側
// クライアントからの接続待ちの部分
while(true){
try{
Socket cs = serverSocket.accept();
addConnection(cs);
Thread ct = new Thread(new
clientProc(cs));
ct.start();
//コネクションの追加
public static void
addConnection(Socket s){
if(connections == null)
connections = new Vector();
connections.addElement(s);
}
//各クライアントにメッセージを送信
public static void sendAll(String s){
if(connections != null){
for(Enumeration e =
connections.elements();
e.hasMoreElements() ;){
try{
PrintWriter pw = new
PrintWriter(((Socket)
e.nextElement()).getOutputStream());
pw.println(s);
pw.flush();
チャットプログラムの実現(3) – クライアント処理側
//各クライアントとの接続処理を行う
public void run(){
public clientProc(Socket s) throws
try{
IOException{
while (name == null){
out.print("name? >");
this.s = s;
out.flush();
in = new BufferedReader(new
name = in.readLine();
InputStreamReader(s.getInputSt }
ream()));
String line = in.readLine();
while(!"quit".equals(line)){
out = new
PrintWriter(s.getOutputStream( ChatServer.sendAll(name + "> " + line);
line = in.readLine();
));
}
}
ChatServer.deleteConnection(s);
s.close();
}catch(IOException e){
try{
s.close();
}catch(IOException e2){}
}
}
//コンストラクタ
チャットプログラムの実現(マルチキャスト)
UDPマルチキャスト通信によるチャットシステムの構築。
全てのクライアントが一つのパケットを共有するシステム。
Peer to Peer(P2P) – 概要
多数の端末間で通信を行う際のアーキ
テクチャの一つ。
対等の者同士が通信することを特徴と
する通信モデル
(※2台のPCを使ってプログラムを動かす)
ネットワークプログラミングを利用した研究
JXTAを用いたP2Pチャットシステム
 位置情報管理システム
 タグ保有端末を利用した位置に捉われ
ないスピーカーシステム
 ZigBeeネットワークによる室内情報管
理
