Internet Start Page  TOP  
 Road of Developers
 
 


DownLoad JavaChat2.lzh(ソースコード付き)





import java.io.* ;
import java.net.* ;
import java.util.* ;
import java.text.*;
public class Server {//実行方法:java Server 8000 10   java Server  
	static final String sLogDat = "log.dat";
	static Vector vLog = new Vector();
	static int MAX_LOG_SIZE = 20;
	public static void logProc(String inString) {//logProc() ログファイルへ書き込む

		try{
			vLog.addElement(inString);//発言ログを発言のつどログファイルへ記録
			FileWriter fw = new FileWriter(sLogDat) ;
			BufferedWriter bw = new BufferedWriter (fw) ;//なければ作成される

				if(vLog.size() > MAX_LOG_SIZE)
				{
					vLog.removeElementAt(0);
				}
				for(int i = 0 ; i < vLog.size(); i++) {
					
					bw.write( vLog.elementAt(i) + "\n") ;
				}
			bw.close() ;
		} catch(IOException e) {System.out.println("Server::logProc :" + e) ;}
		  catch(Exception e) {System.out.println("Server::logProc :" + e) ;	}
	}
	public static void startReadLog()
	{
		try{
			FileReader fr = new FileReader( sLogDat ) ;
			BufferedReader br = new BufferedReader(fr) ;
			String hoe = "" ;
			while( (hoe = br.readLine() ) != null ){
				vLog.addElement(hoe);
			}
		} catch(IOException e) {System.out.println("Server::logProc :" + e) ;}
		  catch(Exception e) {System.out.println("Server::logProc :" + e) ;	}
	}
	public static void addConnections(Socket socket) {// クライアントを追加
		if(vConnections == null) {
			vConnections = new Vector();
		}
		vConnections.addElement(socket);
		vIP.addElement(socket.getInetAddress().getHostAddress());//IPVectorに登録
	}
	public static void deleteConnection(Socket socket) {// クライアントを削除
		if(vConnections != null) {
			vConnections.removeElement(socket);
			vIP.removeElement(socket.getInetAddress().getHostAddress());
		}
	}
	static Vector vIP = new Vector();//ログインユーザーIPアドレス格納Vectro 
	public static void makeSocket(String[] args) {
		int DEFAULT_PORT = 8000;
		ServerSocket serverSocket = null ;
		Socket insocket = null ;
		Thread thread = null ;
		try { if(args.length>0) {
				serverSocket = new ServerSocket(Integer.parseInt(args[0]), Integer.parseInt(args[1])) ;
			} else {
				System.out.println("Java Server  ");
			}
			System.out.println("JavaChat2 Server Starting...");
			while(true) {		
				insocket = serverSocket.accept() ;//接続受付待機
				if(vIP.indexOf(insocket.getInetAddress().getHostAddress())==-1){//2重起動防止IPVectorに登録されていなければ
					addConnections(insocket);//クライアントソケットを追加
					thread = new Thread(new ClientProc(insocket));//クライアント処理をThread化する
					thread.start();
				}
			}
		} catch(IOException e) {System.out.println("Server::main() : " + e) ;}
	}
	public static void main(String[] args) {
		startReadLog();
		makeSocket(args);//ソケットを作成
	}
	static Vector vHostAddress = new Vector();//IPアドレス
	static Vector vHandleName = new Vector() ;
	public static void memberList(int i, String sInetAddress, String sHandleName) {
		switch(i) {
			case 0: // InetAddressをリストの一番最後に追加HandleNameにもInetAddressを入れる
				vHostAddress.addElement(sInetAddress);	
				vHandleName.addElement(sHandleName);break ;
			case 1: // 同じInetAdressを探してhandleNameをついか
				for(int j = 0 ; j < vHostAddress.size(); j++) {
					if(	vHostAddress.elementAt(j).equals(sInetAddress) ) {// IPアドレスが同じであっても別ユーザーの場合もある
						if( vHandleName.elementAt(j).equals(sInetAddress)) {
							vHandleName.setElementAt(sHandleName, j);
							sendAll("/addUser");
						}
					}
				}break ;
			case 2: // 同じInetAdressを探してInetAdressとhandleNameを削除
				for(int j = 0 ; j < vHostAddress.size(); j++) {
					if(	vHostAddress.elementAt(j).equals(sInetAddress) ) {
						if( vHandleName.elementAt(j).equals(sHandleName)) {//なおかつハンドル名も同じでである場合はメンバーリストから削除する
							vHostAddress.removeElementAt(j);
							vHandleName.removeElementAt(j);
							System.out.println("[Server::UserCount in Room : " + Server.vHandleName.size() );
						}
					}
				} break ; // delete
		}
		String sMemberList ="/who;";// メンバーリストをクライアント全員に出力
		for(int y = 0 ; y < vHandleName.size(); y++) {//handleネームをかき集めて、、、
			sMemberList += vHandleName.elementAt(y) + ";" ;
		}
		if(Server.vHandleName.size()!=0) {//ユーザが誰もいないので有れば送信の必要は無し
			sendAll(sMemberList);
		}
	}
	static Vector vConnections = null;
	public static void sendAll(String inString) {//sendAll() クライアント全員に送信
		PrintWriter pw = null ;
		if(vConnections != null) {
			for(Enumeration e = vConnections.elements(); e.hasMoreElements(); ) {
				try{pw = new PrintWriter(((Socket)e.nextElement() ).getOutputStream());
					pw.println(inString);
					pw.flush();
				} catch(IOException ex) {System.out.println("Server::sendAll() : " + ex);}
			}
		}			
	}
	public static void sendUser(String sHandleName, String inString) {//特定のユーザーへ送信
		int i = vHandleName.indexOf(sHandleName);//ハンドルネームのindexからvConnectionsのindexを探す
		if(vConnections != null) {//探し出したソケットにメッセージを送信する
				try{PrintWriter pw = new PrintWriter(((Socket)vConnections.elementAt(i)).getOutputStream());
					pw.println(inString);
					pw.flush();
				} catch(IOException ex) {System.out.println("Server::sendAll() : " + ex);}
		}			
	}
}
class ClientProc implements Runnable{
	Socket socket = null;
	BufferedReader in = null ; // クライアントからのソケット入力用
	String inString = "";
	String sHandleName = "" ;
	public ClientProc(Socket socket) throws IOException{
		this.socket = socket;
		in = new BufferedReader(new InputStreamReader(socket.getInputStream() )) ;
		//#############  ROM  IP/IP
		Server.memberList(0, ""+socket.getInetAddress().getHostAddress(), ""+socket.getInetAddress().getHostAddress());//クライアントのInetAddressをリストにROM表示
	}
	public String getDate(){
		Date date = new Date();
		DateFormat df = new SimpleDateFormat("yyyyy年MMMMMdd aaa hh:mm");//1996.July.10 AD 12:08 PM
		return (String)df.format(date);
	}
	boolean bEnter = false ;
	public void run(){
		try{inString = in.readLine();//読みとり
			while(!"/quit".equals(inString)){//############################### quitじゃなければ
				if(inString != null && inString.length() != 0) {//空白じゃなければ
				    if(inString.charAt(0) == '/'){// "/"がついていたら信号と判断
				        StringTokenizer st = new StringTokenizer(inString, ";");//区切り文字は ;
				        String cmd = st.nextToken();
				        cmd.toLowerCase();//小文字に変換
				        if(cmd.equals("/handle")){//########################## ハンドルネーム
							sHandleName = st.nextToken();
							Server.sendAll("□ "+ sHandleName + " さんが入室されました ["+getDate()+"]");//クライアントへ出力
							Server.logProc("□ "+ sHandleName + " さんが入室されました ["+getDate()+"]");//ログへ出力
							Server.memberList(1, ""+socket.getInetAddress().getHostAddress(), sHandleName);//memberListに追加
							bEnter = true;
						}
				        if(cmd.equals("/mes")){//############################# メッセージ
							String sMes = st.nextToken();
							Server.sendAll(sMes);//クライアントへ出力
							Server.logProc(sMes);//ログへ出力
						}
						if(cmd.equals("/invoke")){//########################## 呼び出し
							if(bEnter==true){
								String sCallMember = st.nextToken();
								Server.sendUser(sHandleName, "/invoke");
								Server.sendUser(sHandleName, "□ "+ sHandleName + " さんがお呼びです ["+getDate()+"]");
							}
						}
				    }
				}
				inString = in.readLine();//読み込み
			}
			if(bEnter==true) {// 入室していないやつは退室もしない
				Server.sendAll("□ "+ sHandleName + " さんが退出されました ["+getDate()+"]");//クライアントへ出力
				Server.logProc("□ "+ sHandleName + " さんが退出されました ["+getDate()+"]");//ログへ出力
				Server.sendAll("/quit");
			}//################################################################# /quit
			Server.memberList(2, ""+socket.getInetAddress().getHostAddress(), sHandleName);//ログインmemberListから削除
			Server.memberList(2, ""+socket.getInetAddress().getHostAddress(), ""+socket.getInetAddress().getHostAddress());//ROM memberListから削除
			Server.deleteConnection(socket);//quitだったらsocketを切断
			in.close();socket.close();
		}catch(IOException e){try{in.close();socket.close();} catch(IOException ex){System.out.println("Server::run() : " + e) ;}}
	}
}


import java.applet.*;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.*;
public class JavaChat2 extends Applet implements Runnable{
    private Hashtable lookup = null;
    boolean reverseScroll = false;
    int state = 0;
    Font font = null;
    AudioClip soundOnline = null;
    AudioClip soundContact = null;
    AudioClip soundKnock = null;
    AudioClip soundQuit = null;
    Color bgcolor = Color.white;
    Color fgcolor = Color.black;
    String channel = "Default";
    int port = 8080 ;
    String host = "127.0.0.1" ;
    int maxAge = 1440;
    int logSize = 10;
    TextArea chatArea = null;
    java.awt.List memberList = null;
    TextField messageField = null;
	boolean ex = false ;//最初のログイン時false ログイン後 true
	final String sLogdatName = "log.dat";
	final String sLogListName = "logIndex.dat";
	/**
	 * 
	 */
	public void init()	{
        lookup = new Hashtable(5);
        lookup.put(  "name", "Java\u30C1\u30E3\u30C3\u30C8");//表示される文字列の国際化
		lookup.put(  "for", "\uFF1E" );
		lookup.put(  "input", "\u3042\u306A\u305F\u306E\u540D\u524D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044");
		lookup.put(  "err_unknown", "\u672A\u5B9A\u7FA9\u306E\u30B3\u30DE\u30F3\u30C9\u3067\u3059");
		lookup.put(  "err_connect", "\u30B5\u30FC\u30D0\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F");
        host = getCodeBase().getHost();//ホスト情報の取得
		soundOnline = getAudioClip(getCodeBase(), "Online.au");
		soundContact = getAudioClip(getCodeBase(), "Contact.au");
		soundKnock = getAudioClip(getCodeBase(), "Knock.au");
		soundQuit = getAudioClip(getCodeBase(), "Quit.au");
		String sParam = getParameter("font");
		String sFont ;
		if(sParam==null){
			sFont = "Serif" ;
		}else{
			sFont = getParameter("size");
		}
		sParam = getParameter("size");
		int iSize ;
		if(sParam==null){
			iSize = 12;
		}else{
			iSize = Integer.parseInt(getParameter("size"));
		}
		int iFonttype ;
		sParam = getParameter("fonttype");
		if(sParam==null){
			iFonttype = 0;
		}else{
			iFonttype = Integer.parseInt(getParameter("fonttype"));
		}
		setFont(font = new Font(sFont, iFonttype, iSize));
	
		sParam = getParameter("channel");
		if(sParam == null){
			channel = "Default"	;
		}else{
			channel = getParameter("channel");
		}
		sParam = getParameter("port");
		if(sParam == null){
			port = 8000;
		}else{
			port = Integer.parseInt(getParameter("port"));//8000
		}
		sParam = getParameter("maxAge");
		if(sParam == null){
			maxAge = 1440 ;
		}else{
			maxAge = Integer.parseInt(getParameter("maxAge"));//1440
		}
		sParam = getParameter("logSize");
		if(sParam == null){
			logSize = 10;
		}else{
			logSize = Integer.parseInt(getParameter("logsize"));//10
		}
		sParam = getParameter("bgcolor");
		if(sParam == null){
			bgcolor = new Color(Integer.parseInt("ffffff", 16));
		}else{
			bgcolor = new Color(Integer.parseInt(getParameter("bgcolor"), 16));
		}
		sParam = getParameter("fgcolor");
		if(sParam == null){
			fgcolor = new Color(Integer.parseInt("000000", 16));
		}else{
			fgcolor = new Color(Integer.parseInt(getParameter("fgcolor"), 16));
		}
        setBackground(bgcolor);
		setLayout(new BorderLayout());
        Panel p = new Panel();
        p.setLayout(new BorderLayout());
        p.add("Center", chatArea = new TextArea());
        chatArea.setEditable(false);
        chatArea.setBackground(bgcolor);
        chatArea.setForeground(fgcolor);
        chatArea.setFont(font);
        p.add("East", memberList = new java.awt.List());
        memberList.setBackground(bgcolor);//ユーザーリスト
        memberList.setForeground(fgcolor);
        memberList.setFont(font);
        add("Center", p);
        Panel p2 = new Panel();
        p2.setLayout(new GridLayout(1, 1));
        p2.add(messageField = new TextField());
        messageField.setBackground(bgcolor);
        messageField.setForeground(fgcolor);
        messageField.setFont(font);
        add("South", p2);
        reverseScroll = true;
	}
    Thread thread = null;
    Socket socket = null;
	BufferedReader input = null ;
	PrintWriter output = null;
    public void start() {
		int retry = 0;
        try { while(socket == null){
                try{socket = new Socket(host, port);
					input = new BufferedReader(new InputStreamReader(socket.getInputStream() )) ;
					output = new PrintWriter( socket.getOutputStream());
					retry = 0;
                }catch(SocketException se){
                    if(retry >= 5){
						chatArea.insert("Error JavaChat2::start() : " + se + "\n", 0);
					}
                    socket = null;
                    retry++;
                }
			}
        }catch(IOException ie){ chatArea.insert("Error JavaChat2::start() : " + (String)lookup.get("err_connect") + "\n", 0); return; }
        state = 1;
        chatArea.setText("");
        messageField.setText((String)lookup.get("input"));
        messageField.requestFocus();
        messageField.selectAll();
        if(thread != null){
			System.out.println("Error JavaChat2::start() : internal error!");
		}
        thread = new Thread(this);
        thread.start();
		chatArea.insert("\n□□□JavaChat2 Version " + getParameter("version") + "2002 SUZUKI I-ichirow □□□\n\n", 0);
		if(getParameter("log").equals("True")){
			readLog(sLogdatName);//ログを表示する
		}
    }
    public void run(){
        while(true){
            String line="";
            try{line = input.readLine();//サーバーからの文字列を取得
            }catch(IOException e){}
			if(line != null && line.length() != 0){
                if(line.charAt(0) == '/'){// スラッシュがついていたらサーバーからの信号と受け取る
                    StringTokenizer st = new StringTokenizer(line, ";");//区切り文字は ;
                    String cmd = st.nextToken();
                    cmd.toLowerCase();
                    if(cmd.equals("/who")){//受信受信受信受信受信受信受信受信受信受信受信受信受信
                        memberList.removeAll();//memberリストを全て消去して
						for(; st.hasMoreTokens(); memberList.addItem("□ "+st.nextToken()));//全員追加する
					}
                    if(cmd.equals("/mes")){//受信受信受信受信受信受信受信受信受信受信受信受信受信
						chatArea.insert(st.nextToken(), 0);//コメントペインに表示
					}
					if(cmd.equals("/addUser")){
						if(ex){
							soundContact.play();
						}else{
							soundOnline.play();
						}
						ex=true;
					}
					if(cmd.equals("/invoke")){
						soundKnock.play();
					}
					if(cmd.equals("/quit")){
						soundQuit.play();
					}
                } else {
					chatArea.insert(line + "\n", 0);// サーバーからの文字列をそのまま表示 エラー表示など
                }
			}
        }
    }
	public void readLog(String sLog){
		try{URL url = new URL(getCodeBase() + sLog);
			URLConnection urlconnection = url.openConnection();
            InputStream inputstream = urlconnection.getInputStream();
            InputStreamReader inputstreamreader = new InputStreamReader(inputstream, "SJIS");
            BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
			String hoe = "" ;
			for(int i = 0 ; i < Integer.parseInt(getParameter("logLine")); i ++ ){
				hoe = bufferedreader.readLine();
				if(hoe != null){
					chatArea.insert(hoe + "\n", 0);
				}
			}
			bufferedreader.close();
			inputstream.close();
		}catch(IOException e){	
			chatArea.insert("\n□□□指定されたファイルを開く事ができませんでした□□□\n\n", 0);
		}
	}
	String sHandleName= "";
    public boolean action(Event evt, Object what){
        if(evt.target == messageField){
                String mes = messageField.getText();
                if(mes != null && mes.length() != 0){
					if(mes.charAt(0) == '/'){// スラッシュがついていたらサーバーからの信号と受け取る
						StringTokenizer st = new StringTokenizer(mes, ";");//区切り文字は ;
						String task = st.nextToken();// /logを抽出
						if(task.equals("/version")){
							chatArea.insert("\n□□□JavaChat2 Version " + getParameter("version") + "2002 SUZUKI I-ichirow □□□\n\n", 0);
						}
					}else{
					    switch(state){
							case 1: // '\001'入室時
							    for(; mes.charAt(0) == '/' && mes.length() > 1; mes = mes.substring(1));
							    if(!mes.equals("/")){// ハンドル名をサーバーへ
									output.println("/handle;" + mes);
									output.flush();
									sHandleName = mes;//ユーザーハンドルネームとして格納
									state=2;
							    }break;
							case 2: // '\002'入室後はhandleNameとメッセージをまとめて送る// メッセージをサーバーへ
								output.println("/mes;" + sHandleName + " > " + mes);
								output.flush();
								break;
					    }
					}
					messageField.setText("");//送信したらテキストフィールドをnullにする					
                }
            return true;
        }
        if(evt.target == memberList){//メンバーリストをダブルクリック
			messageField.requestFocus();
			output.println("/invoke;"+memberList.getSelectedItem());
			output.flush();
		}
        return false;
    }
    public void stop(){
        if(thread == null){
            System.out.println("JavaChat2 #stop: internal error!");
		}
        try{output.print("/quit");
			output.flush();
            output.close();
            input.close();
            socket.close();
			thread.stop();
			thread = null;
        }catch(IOException ie){System.out.println(ie.toString());}
        state = 0;
    }
}

インターネットスタートページ 鈴木維一郎 石橋三重子
         
               
                   


©2000 kg-group Inc.