第6章 インターネットアプリケーション 6.1 6.2 6.3 6.4 6.5 インターネットアプリケーション Javaによるネットワーク処理 電子メール Webアプリケーション チャットアプリケーション 6.5 チャットアプリケーション 6.5.1 チャットアプリケーションの仕組み (1)TCPの利用 ■ ひとつのチャットサーバと複数のチャットクライアント [送信端末] チャットクライアント チャットサーバ チャットクライアント チャットクライアント (2)UDPの利用 ■ すべてチャットクライアント チャットクライアント チャットサーバ機能 チャットクライアント機能 チャットクライアント チャットクライアント チャットサーバ機能 チャットサーバ機能 チャットクライアント機能 チャットクライアント機能 6.5.2 TCPを利用したチャットアプリケーション (1)チャットサーバの実現(その1 /3 ) ■ サーバは,チャットクライアントから受取ったメッセージを,コネクションが確立してい る他のチャットクライアントに送信する。 [ChatServerクラス] import java.io.*; import java.net.*; import java.until.*; private class ChatServer{ private static final int port = 6000; // ポート番号 private static void main(String [] args) { try{ ServerSocket serverSocket = new SeverSocket(port); while(true) { Socket cs = serverSocket.accept(); ClientConnection connection = new ClientConnection(cs); } } catch(IOException e){} } } [クライアントコネクションをスレッドとする] チャットサーバの実現(その2 /3 ) class ClientConnection extends Thread{ private Socket socket; private BufferedReader in; private BufferedWriter out; static Vector members;//複数クライアントのコネクション Vector ClientConnection(Socket s){//クライアントコネクションのコンストラクタ socket = s; if(members == null) members = new Vector(); members.add(socket); try{ in = new BufferedReader( // ソケットからストリームを取り込む new InputStreamReader(socket.getInputStream())); } catch(IOException e) {} } public void run(){ try { while(true){ // メッセージをコンソールに出力 String message = in.readLine(); writeMessageAll(message + "\n"); System.out.println(message); if(message.equals("Bye")){ socket.close(); // 「Bye」の入力により切断 break; } } } catch(IOException e){} } チャットサーバの実現(その3/3) [すべてのクライアントにメッセージを転送する] public void writeMessageAll(String message){ Socket soc = null; for(Enumeration em = members.elements(); em.hasMoreElements();){ soc =(Socket)em.nextElement(); try { BufferedWriter bw = new BefferedWriter( new OutputStream Writer(soc.getOutputStream())); bw.write(message); bw.flush(); } catch(IOException e) {} } } (2)チャットクライアントの実現 ■ TCPコネクションのプログラムで代用できるが,キーボードから入力されたものを出 力ストリームに出力するようにする。 [ChatServerクラス] public void run(){ try { while(true) { String keyLine = keyin.readLine(); BufferedWriter bw = new BufferedWriter( new OutputStream writer(serverSocket.getOutputStream())); bw.write(keyLine); bw.flush(); } catch(IOException e){} } (3)チャットの実行例 ■ 1つのサーバと2つのクライアント >java ChatServer Hello! Hi ④Hi >java TCPClient Hello! Hi ①Hello! ②Hello! ③Hi >java TCPClient Hello! Hi 6.5.3 UDPを利用したチャットアプリケーション (1)メッセージ送信機能の実現 ■ データパケットを作成して,マルチキャストソケットに送信する(sendメソッド) ■IPアドレスは,マルチキャストグループのIPアドレス,ポート番号を送る。 ■データグラムの生存期間(TTL : Time To live)はデフォルト1。 ■ルータを超えたマルチキャスト通信を行わなければ,TTL はデフォルトのままでい いが,変えるには SetTimeToLive メソッドを用いる。 メッセージ送信クラス [コンソールから入力した文字列をマルチキャストグループに送信] import java.net.* public class MessageSend extends Thread { MulicastSocket ms; InetAddress inetAddr; int port; byte[] buff = new byte[1024];//送信データ MessageSend(MulticastSocket msocket, InetAddress mgroup, int port_number){ ms = msocket; inetAddr = mgroup; port = port_number; } public void run(){ try { while(true){ int n = System.in.read(buff, 0, buff.length); if(n > 0){ DatagramPacket dp = new DatagramPacket(buff, n, inetAddr, port); ms.send(dp); } else break; } } catch(IOException e){e.printStackTrace(); System.exit();} } } (2)メッセージ受信機能の実現 ■ メッセージをDatagramPacket オブジェクトとして受信する(receive メソッド) ■ DatagramPacket オブジェクトには,受信データのほかに送信先のIPアドレスと ポート番号が格納されている。 ■ receive メソッドはデータグラムが受信するまで入出力ブロックを行うので,スレッド として実装する必要がある。 メッセージ受信クラス [受信したメッセージをコンソールに出力] import java.net.* public class MessageReceive extends Thread { MulicastSocket ms; byte[] buff = new byte[1024];//受信データ MessageReceive(MulticastSocket msocket){ ms = msocket; } public void run(){ try { while(true){ DatagramPacket recv = new DatagramPacket(buff, buff.length); ms.receive(recv); if(recv.getLength() > 0) System.out.write(buff, 0, recv.getLength()); } } catch(IOException e){e.printStackTrace(); System.exit();} } } (3)チャットアプリケーション ■ メッセージ送信機能とメッセージ受信機能を併せ持った機能を作成する。 ■ 送受信ともスレッドとして実行されるクラスなので,MulticastSocket オブジェクトは 送受信で共有されるようにする。 送受信の実行 [コンソール入力をマルチキャストとして送り,受信したメッセージをコンソールに出力] import java.net.* public class ChatApp{ public static void main(String[] args){ String multicastAddress="224.0.0.1"; int port = 7000; try { InetAddress group = InetAddress.getByName(multicastAddress); MulticastSocket msocket = new MulticastSocket(port); // マルチキャストグループに参加 msocket.joinGroup(group); // 送信スレッド開始 MessageSend ms = new MessageSend(msocket, group, port); ms.start(); // 受信スレッド開始 MessageReceive mr = new MessageReceive(msocket); mr.start(); } } catch(IOException e){} } } (4)実行例 ■ 3つの ChatApp を起動 Client 1 >java ChatApp Hello! Hello! Hi Client 2 >java ChatApp Hello! Hi Hi Client 3 >java ChatApp Hello! Hi
© Copyright 2024 ExpyDoc