Newer
Older
test001 / Chat.java
@Motoki Miura Motoki Miura on 7 Aug 2020 4 KB java files
// 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.println("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