package j6;
// Chat.java
// マルチキャストを使ってチャット機能を提供
// 使い方 > java Chat
import java.net.*;
import java.io.*;
//==============================================================================
public class Chat {
// 受信スレッドを作成・実行し,送信を担当
final byte TTL = 1; //同一セグメント内部のみ到達可能とする.
final String MULTICASTADDRESS = ("224.0.0.1") ;
// マルチキャストアドレス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.print("Input your name: ") ;
try{
myname = lineread.readLine() ;
}catch(Exception e){
e.printStackTrace() ;
System.exit(1) ;
}
System.out.println("Welcome " + myname + "!") ;
myname = myname + ">" ;
nameLength = (myname.getBytes()).length ;
for(int i = 0;i < nameLength;++i)
buff[i] = (myname.getBytes())[i] ;
}
//-----------------------------------------------------------------------------
public void makeMulticastSocket() {
// MULTICASTADDRESSに対してマルチキャストソケットを作成.
try{
chatgroup
= InetAddress.getByName(MULTICASTADDRESS) ;
soc = new MulticastSocket(port) ;
soc.joinGroup(chatgroup) ;
}
catch(Exception e){
e.printStackTrace() ;
System.exit(1);
}
} // end of makeMulticastSocket
//-----------------------------------------------------------------------------
public void startListener() {
// スレッド用クラスListenPacketのオブジェクトを生成し,起動.
try{
ListenPacket lisner =
new ListenPacket(soc);
Thread lisner_thread = new Thread(lisner);
lisner_thread.start();//受信スレッドの開始
}
catch(Exception e){
e.printStackTrace() ;
System.exit(1);
}
} // end of startListener
//-----------------------------------------------------------------------------
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) ;
}
else break ;// ループ終了
}
}
catch(Exception e){
e.printStackTrace() ;
System.exit(1);
}
} // end of sendMsgs
//-----------------------------------------------------------------------------
public void quitGroup() {
// 接続を終了
try{
System.out.println("Connection Closed.") ;
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() ;
}
} // end of class Chat
//==============================================================================
// ListenPacketクラス
// マルチキャストパケットを受信します
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) ;
}
}
} // end of class ListenPacket