본문 바로가기

IT Trend

ChatClient 분석 소스


import java.net.*;			
import java.io.*;			
			
public class ChatClient {			
			
	public static void main(String[] args) {		
		if(args.length != 2){	
			System.out.println("사용법 : java ChatClient id 접속할서버ip");
			System.exit(1); //id와 ip를 적으면 배열 개수가 2가 되기 때문에 만약 2가 아니라면 잘못입력 된것이므로 프로그램을 종료한다. 
		}	
		Socket sock = null;	
		BufferedReader br = null;	
		PrintWriter pw = null;	
		boolean endflag = false;	
		try{	
			sock = new Socket(args[1], 10001); //args[1]은 서버 ip이므로 소켓에 ip주소를 전달한다.
			pw = new PrintWriter(new OutputStreamWriter(sock.getOutputStream()));	//서버에 데이터를 전달할 수 있는 스트림을 생성한다.	
			br = new BufferedReader(new InputStreamReader(sock.getInputStream()));	//서버로부터 데이터를 받아 올 수 있는 스트림을 생성한다.	
			BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));	//사용자가 콘솔상에서 직접 입력하는 스트림을 생성한다.
			// 사용자의 id를 전송한다.		
			pw.println(args[0]); //서버로 사용자 id 전송!		
			pw.flush();	// 버퍼 비우기!	
			InputThread it = new InputThread(sock, br); //클라이언트의 스레드이다. 데이터를 받으면서 동시에 문자를 입력하도록 한다.		
			it.start();		//스레드 시작!
			String line = null;		
			while((line = keyboard.readLine()) != null){	// 사용자가 입력한 문자열을 입력받아 서버로 전송하는 역할을 한다.	
				pw.println(line);	//pw 서버로 이어지는 출력 스트림.
				pw.flush();	
				if(line.equals("/quit")){	//만약 사용자가 /quit를 입력했다면, endflag를 true로 바꾸고 while문을 빠져나온다.
					endflag = true;
					break;
				}	
			}		
			System.out.println("클라이언트의 접속을 종료합니다.");
		}catch(Exception ex){			
			if(!endflag)		
				System.out.println(ex);	
		}finally{			
			try{		
				if(pw != null)	
					pw.close();
			}catch(Exception ex){}		
			try{		
				if(br != null)	
					br.close();
			}catch(Exception ex){}		
			try{		
				if(sock != null)	
					sock.close();
			}catch(Exception ex){}		
		} // finally			
	} // main				
} // class					
					
/* InputThread는 클라이언트 프로그램이 입력을 하는 동시에 데이터를 받을 수 있게 해준다.
 * 이 스레드는 들어오는 데이터를 계속해서 받아주는 역할을 한다.
 */					
class InputThread extends Thread{					
	private Socket sock = null;				
	private BufferedReader br = null;				
	public InputThread(Socket sock, BufferedReader br){ //생성과 동시에 소켓 넘버와 서버로부터 데이터를 읽어오는 입력 스트림의 주소를 받는다.				
		this.sock = sock;			
		this.br = br;			
	}				
	public void run(){				
		try{			
			String line = null;		
			while((line = br.readLine()) != null){		//서버로부터 데이터를 읽음과 동시에 화면에 출력해준다.
				System.out.println(line);	
			}		
		}catch(Exception ex){			
		}finally{			
			try{		
				if(br != null)	
					br.close();
			}catch(Exception ex){}		
			try{		
				if(sock != null)	
					sock.close();
			}catch(Exception ex){}		
		}			
	} // InputThread				
}					

'IT Trend' 카테고리의 다른 글

포항공과대학교 대학원 입학설명회에 가다.  (0) 2018.10.01
ChatServer 분석 소스  (0) 2016.12.12
EchoThreadServer 분석 소스  (0) 2016.12.12
EchoServer 분석소스  (0) 2016.12.12
EchoClient 분석소스  (0) 2016.12.12