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ネットワークによる室内情報管 理
© Copyright 2024 ExpyDoc