Chat Server import java io import java net

  • Slides: 15
Download presentation

6.5.2 TCPを利用したチャットアプリケーション (1)チャットサーバの実現(その1 /3 ) ■ サーバは,チャットクライアントから受取ったメッセージを,コネクションが確立してい る他のチャットクライアントに送信する。 [Chat. Serverクラス] import java. io. *;

6.5.2 TCPを利用したチャットアプリケーション (1)チャットサーバの実現(その1 /3 ) ■ サーバは,チャットクライアントから受取ったメッセージを,コネクションが確立してい る他のチャットクライアントに送信する。 [Chat. Serverクラス] import java. io. *; import java. net. *; import java. until. *; private class Chat. Server{ private static final int port = 6000; // ポート番号 private static void main(String [] args) { try{ Server. Socket server. Socket = new Sever. Socket(port); while(true) { Socket cs = server. Socket. accept(); Client. Connection connection = new Client. Connection(cs); } } catch(IOException e){} } }

[クライアントコネクションをスレッドとする] チャットサーバの実現(その2 /3 ) class Client. Connection extends Thread{ private Socket socket; private Buffered.

[クライアントコネクションをスレッドとする] チャットサーバの実現(その2 /3 ) class Client. Connection extends Thread{ private Socket socket; private Buffered. Reader in; private Buffered. Writer out; static Vector members; //複数クライアントのコネクション Vector Client. Connection(Socket s){//クライアントコネクションのコンストラクタ socket = s; if(members == null) members = new Vector(); members. add(socket); try{ in = new Buffered. Reader( // ソケットからストリームを取り込む new Input. Stream. Reader(socket. get. Input. Stream())); } catch(IOException e) {} } public void run(){ try { while(true){ // メッセージをコンソールに出力 String message = in. read. Line(); write. Message. All(message + "n"); System. out. println(message); if(message. equals("Bye")){ socket. close(); // 「Bye」の入力により切断 break; } } } catch(IOException e){} }

チャットサーバの実現(その3/3) [すべてのクライアントにメッセージを転送する] public void write. Message. All(String message){ Socket soc = null; for(Enumeration em

チャットサーバの実現(その3/3) [すべてのクライアントにメッセージを転送する] public void write. Message. All(String message){ Socket soc = null; for(Enumeration em = members. elements(); em. has. More. Elements(); ){ soc =(Socket)em. next. Element(); try { Buffered. Writer bw = new Beffered. Writer( new Output. Stream Writer(soc. get. Output. Stream())); bw. write(message); bw. flush(); } catch(IOException e) {} } }

(2)チャットクライアントの実現 ■ TCPコネクションのプログラムで代用できるが,キーボードから入力されたものを出 力ストリームに出力するようにする。 [Chat. Serverクラス] public void run(){ try { while(true) { String

(2)チャットクライアントの実現 ■ TCPコネクションのプログラムで代用できるが,キーボードから入力されたものを出 力ストリームに出力するようにする。 [Chat. Serverクラス] public void run(){ try { while(true) { String key. Line = keyin. read. Line(); Buffered. Writer bw = new Buffered. Writer( new Output. Stream writer(server. Socket. get. Output. Stream())); bw. write(key. Line); bw. flush(); } catch(IOException e){} }

(3)チャットの実行例 ■ 1つのサーバと2つのクライアント >java Chat. Server Hello! Hi ④Hi >java TCPClient Hello! Hi ①Hello!

(3)チャットの実行例 ■ 1つのサーバと2つのクライアント >java Chat. Server Hello! Hi ④Hi >java TCPClient Hello! Hi ①Hello! ②Hello! ③Hi >java TCPClient Hello! Hi

メッセージ送信クラス [コンソールから入力した文字列をマルチキャストグループに送信] import java. net. * public class Message. Send extends Thread { Mulicast.

メッセージ送信クラス [コンソールから入力した文字列をマルチキャストグループに送信] import java. net. * public class Message. Send extends Thread { Mulicast. Socket ms; Inet. Address inet. Addr; int port; byte[] buff = new byte[1024]; //送信データ Message. Send(Multicast. Socket msocket, Inet. Address mgroup, int port_number){ ms = msocket; inet. Addr = mgroup; port = port_number; } public void run(){ try { while(true){ int n = System. in. read(buff, 0, buff. length); if(n > 0){ Datagram. Packet dp = new Datagram. Packet(buff, n, inet. Addr, port); ms. send(dp); } else break; } } catch(IOException e){e. print. Stack. Trace(); System. exit(); } } }

メッセージ受信クラス [受信したメッセージをコンソールに出力] import java. net. * public class Message. Receive extends Thread { Mulicast.

メッセージ受信クラス [受信したメッセージをコンソールに出力] import java. net. * public class Message. Receive extends Thread { Mulicast. Socket ms; byte[] buff = new byte[1024]; //受信データ Message. Receive(Multicast. Socket msocket){ ms = msocket; } public void run(){ try { while(true){ Datagram. Packet recv = new Datagram. Packet(buff, buff. length); ms. receive(recv); if(recv. get. Length() > 0) System. out. write(buff, 0, recv. get. Length()); } } catch(IOException e){e. print. Stack. Trace(); System. exit(); } } }

送受信の実行 [コンソール入力をマルチキャストとして送り,受信したメッセージをコンソールに出力] import java. net. * public class Chat. App{ public static void main(String[]

送受信の実行 [コンソール入力をマルチキャストとして送り,受信したメッセージをコンソールに出力] import java. net. * public class Chat. App{ public static void main(String[] args){ String multicast. Address="224. 0. 0. 1"; int port = 7000; try { Inet. Address group = Inet. Address. get. By. Name(multicast. Address); Multicast. Socket msocket = new Multicast. Socket(port); // マルチキャストグループに参加 msocket. join. Group(group); // 送信スレッド開始 Message. Send ms = new Message. Send(msocket, group, port); ms. start(); // 受信スレッド開始 Message. Receive mr = new Message. Receive(msocket); mr. start(); } } catch(IOException e){} } }

(4)実行例 ■ 3つの Chat. App を起動 Client 1 >java Chat. App Hello! Hi Client

(4)実行例 ■ 3つの Chat. App を起動 Client 1 >java Chat. App Hello! Hi Client 2 >java Chat. App Hello! Hi Hi Client 3 >java Chat. App Hello! Hi