// Chat.java マルチキャスト版 チャットサーバーの必要のないチャットプログラム // 使い方:java Chat ポート番号 import java.net.* ; import java.io.* ; // Chatクラスは受信スレッドを作成実行し、送信を担当します。 public class Chat { final byte TTL = 1 ; final String MULTICASTADDRESS = ("224.0.0.1") ;// マルチキャストアドレス int port = 6000 ; // チャットようのポート番号 指定がなければ6000にする byte[] buff = new byte[1024] ;// 送信用バッファ String myname = "" ;// 利用者名 int nameLength = 0 ; MulticastSocket soc = null ; InetAddress chatgroup = null ; public Chat(int portno) { port = portno ; BufferedReader lineread = new BufferedReader(new InputStreamReader(System.in)) ; System.out.println("お名前をどうぞ") ; try { myname = lineread.readLine() ; } catch(Exception e) { e.printStackTrace() ; System.exit(1) ; } System.out.println("ようこそ" + myname + "さん") ; myname = myname + ">" ; nameLength = (myname.getBytes()).length ; for(int i = 0 ; i < nameLength ;++i) { buff[i] = (myname.getBytes())[i] ; } } // MULTICASTADDRESSに対してマルチキャストソケットを作成 public void makeMulticastSocket() { try { chatgroup = InetAddress.getByName(MULTICASTADDRESS) ; soc = new MulticastSocket(port) ; soc.joinGroup(chatgroup) ; } catch(Exception e) { e.printStackTrace() ; System.exit(1) ; } } // スレッド用クラスListenPacketのオブジェクトを生成し起動 public void startListener() { try { ListenPacket lisner = new ListenPacket(soc) ; Thread lisner_thread = new Thread(lisner) ;; lisner_thread.start() ; //受信スレッドの開始 } catch(Exception e) { e.printStackTrace() ; System.exit(1) ; } } // マルチキャストパケットの送信担当 public void sendMsgs() { try { while(true)// 送信ループ { int n = System.in.read(buff, nameLength, 1024 - nameLength) ; if(n > 0) { DatagramPacket dp = new DatagramPacket( buff, n + nameLength, chatgroup, port) ; soc.send(dp, TTL) ; } else break ;// 送信終了 } } catch(Exception e) { e.printStackTrace() ; System.exit(1) ; } } // 接続を終了する public void quitGroup() { try { System.out.println("接続終了") ; soc.leaveGroup(chatgroup) ; System.exit(0) ; } catch(Exception e) { e.printStackTrace() ; System.exit(1) ; } } public static void main(String[] arg) { Chat c = null ; int portno = 6000 ; if(arg.length >= 1) { portno = Integer.parseInt(arg[0]) ; } c = new Chat(portno) ; c.makeMulticastSocket() ; c.startListener() ; c.sendMsgs() ; c.quitGroup() ; } } // マルチキャストパケットを受信 class ListenPacket implements Runnable { MulticastSocket s = null ; public ListenPacket(MulticastSocket soc)// コンストラクタでマルチキャストスレッドを受け取ります。 { s = soc ; } public void run()// 処理の本体 { byte[] buff = new byte[1024] ; try { while(true) { DatagramPacket recv = new DatagramPacket(buff, buff.length) ; s.receive(recv) ; if(recv.getLength() > 0 ) { System.out.write(buff, 0, recv.getLength()) ; } } } catch(Exception e) { e.printStackTrace() ; System.exit(1) ; } } }