무작정 개발.Vlog

[JAVA+국비교육] Class 클래스, 정규화표현식, 채팅프로그램 만들기

by 무작정 개발
반응형
2022.01.14(19일 차)

 

오늘의 수업 내용

 

Class 클래스

특정 클래스나 인터페이스의 정보를 검색할 수 있는 메서드를 가지고 있다.

package com.day18;

// Class 클래스
// 특정 클래스나 인터페이스의 정보를 검색할 수있는 메서드를 가지고 있다.

class Test {
	
	public void write() {
		
		System.out.println("테스트...");
		
	}
}


public class Test1 {

	public static void main(String[] args) throws Exception {
		
		// 특정 메서드 정보를 불러옴.패키지 이름까지 꼭 적어야함
		// 또한 지정한 클래스가 없을 수 있기에 예외처리 해줘야함 (throws Exception)!!!
		Class c = Class.forName("com.day18.Test");
		
		
		// o의 데이터 타입을 모르기 때문에 일단 Object로 받아서 담아버린다.
		Object o = c.newInstance(); // 객체 생성
		
		Test t = (Test)o;
		
		t.write();

	}
}
package com.day18;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test2 {

	public static void main(String[] args) throws Exception {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		System.out.print("클래스명[java.lang.String]?");
		String str = br.readLine();
		
		Class cls = Class.forName(str);
		
		//String의 생성자 정보
		System.out.println("생성자 정보...");
		Constructor<?>[] c = cls.getConstructors();
		for(int i=0; i<c.length; i++) {
			System.out.println(c[i]);
		}
		
		System.out.println("필드 정보...");
		Field[] f = cls.getFields();
		for(int i=0; i<f.length; i++) {
			System.out.println(f[i]);
		}
		
		System.out.println("메서드 정보...");
		Method [] m = cls.getMethods();
		for(int i=0; i<m.length; i++) {
			System.out.println(m[i]);
		}
		
		
	}

}

정규화 표현식

c [a-z]* : c로 시작하는 영단어
c [a-z] : c로 시작하는 두 글자 영단어(c, ca, cz)
c [a-zA-ZO-9] : ca, cA, c4
c. : c로 시작하는 두 글자(ca, cB, c&)
c.* : c로 시작하는 모든 글자
[b|c].* 또는 [bc].* 또는 [b-c].* : b,c,bbb
[\\b]+ 또는 [0-9]+ : 하나 이상의 숫자

 

package com.day18;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

//정규화 표현식
//java.util.regex

public class Test3 {

	public static void main(String[] args) {
		
		String[] str = {"bat", "baby", "bonus", "c", "cA", "ca", "c.", "c0", 
				"car", "combat", "count", "date", "disc" };
		
		Pattern p;
		
		p = Pattern.compile("c[a-z]*");
		for(String s : str) {
			Matcher m = p.matcher(s);
			if(m.matches()) {
				System.out.println(s);
			}
		}
		
		System.out.println("-----------------------------------------");
		
		p = Pattern.compile("c.");
		for(String s : str) {
			Matcher m = p.matcher(s);
			if(m.matches()) {
				System.out.println(s);
			}
		}
		
		System.out.println("-----------------------------------------");
		
		String[] mails = {"aaa@aaa.com", "@aaa.co.kr", ".bbb.com", "aaa@vvv.co.kr", "sss.co.kr", "abc@aaa"};
		
		
		String pat = "[\\w]+@[\\w]+(\\.[\\w]+)+";
		
		for(String s : mails) {
			
			if(Pattern.matches(pat, s)) {
				System.out.println(s);
			}
		}
		
	}
}

Test 3 실행
Test 3 실행


주소를 찾아가서 HTML 파일 읽어오기

package com.day18;

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

public class Test5 extends Frame implements ActionListener {
	
	private static final long serialVersionUID = 1L;
	
	private TextArea ta;
	private TextField tf;
	
	
	public Test5() {
		
		ta = new TextArea();
		add(ta);
		
		tf = new TextField();
		tf.addActionListener(this);
		add(tf,BorderLayout.NORTH);
		
		//종료버튼
		addWindowListener(new WindowAdapter() {
			
			@Override
			public void windowClosing(WindowEvent e) {
				
				System.exit(0);
			}
		});
		
		setTitle("HTML Viewer");
		setSize(400, 300);
		setVisible(true);
	}

	
	
	public static void main(String[] args) {
		
		new Test5();
		
		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		
		try {
			
			String str;
			URL url = new URL(tf.getText());
			
			ta.setText("");
			
			//위의 url를 찾아가서 openStream연결
			
			//방법1
			//InputStream is = url.openStream(); -> 애는 필요한 곳에 빨대를 꼿는 느낌(꼿으면 물이 들어옴)
			
			//방법2
			//나 갈거야 말해주고 레드카펫 깔아줘 등 (정문으로 들어간다 혹은 고급지게 들어간다는 느낌)
			URLConnection conn = url.openConnection();
			InputStream is = conn.getInputStream();
					
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			
			while((str = br.readLine()) != null) {
				
				if(ta.getText().equals(""))
					ta.setText(str);
				
				else
					ta.setText(ta.getText() + "\n\r" + str);
			}
			is.close();
			
			
		} catch (Exception e2) {
			// TODO: handle exception
		}	
	}
}

일대일 채팅 프로그램

ClientTest : 채팅 시스템에 접속하는 클라이언트 클래스

ServerTest : 채팅 서버 클래스

 

1대1 채팅 프로그램 구조
1대1 채팅 프로그램 구조

 

ClientTest

package com.day18;

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

//다중 인터페이스
public class ClientTest extends Frame implements ActionListener,Runnable{

	private static final long serialVersionUID = 1L;
	
	private TextArea ta = new TextArea();
	private TextField tf = new TextField();
	
	// 클라이언트는 소켓만 필요
	private Socket sc = null;
	private String host = "localhost";//localhost(127.0.0.1)192.168.16.0
	private int port = 7777;
	
	
	// 기본 생성자를 통해 ActionListener의 기본값을 설정
	public ClientTest() {
		
		add(ta,BorderLayout.CENTER);
		add(tf,BorderLayout.SOUTH);
		
		//텍스트입력창에 리스너
		tf.addActionListener(this);
		
		//종료
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
				
		setTitle("채팅클라이언트");
		setSize(300, 400);
		setVisible(true);
		
	}	

	public void connect() {
		
		try {
			
			sc = new Socket(host, port);
			
			Thread th = new Thread(this);
			th.start();
			
		} catch (Exception e) {
			System.out.println(e.toString());
		}
		
	}	
	
	// 실행되면 main문을 가장 먼저 찾아간다.
	public static void main(String[] args) {
		new ClientTest().connect();
	}

	@Override
	public void run() {
		//데이터를 받을때 
		
		String str;
				
		try {
			
			if(sc==null)
				return;
			
			InputStream is = sc.getInputStream();
			BufferedReader br = new BufferedReader(new 
					InputStreamReader(is));
						
			while((str=br.readLine())!=null) {
				ta.append("\r\n" + str);
			}			
			
		} catch (Exception e) {
			ta.append("\r\n 서버 연결 종료...");
			sc = null;
		}
		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		//데이터를 보낼때
		
		String str = tf.getText();
		
		if(str.trim().equals("")) {
			return;
		}
		
		if(sc==null) {
			return;
		}
		
		try {
					
			//true:flush
			PrintWriter pw = new PrintWriter(sc.getOutputStream(),true);
			pw.println("수지]" + str); //클라이언트에 전송
			
			ta.append("\r\n수지]:" + str);
			
			tf.setText("");
			tf.requestFocus();
			
		} catch (Exception e2) {
			ta.append("\r\n 서버와 접속이 끊겼습니다...");
			sc = null;
		}
		
				
	}

}

 

ServerTest

package com.day18;

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerTest extends Frame implements ActionListener,Runnable{

	private static final long serialVersionUID = 1L;
	
	private TextArea ta = new TextArea();
	private TextField tf = new TextField();
	private ServerSocket ss = null;
	private Socket sc = null;
	
	public ServerTest() {
		
		add(ta,BorderLayout.CENTER);
		add(tf,BorderLayout.SOUTH);
		tf.addActionListener(this);
		
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
				
		setTitle("채팅서버");
		setSize(300, 400);
		setVisible(true);
		
	}	

	public void serverStart() {
		
		try {
			
			ss = new ServerSocket(7777);
			ta.setText("서버시작!!!");

			sc = ss.accept();//클라이언트와 연결
			
			Thread th = new Thread(this);
			th.start();
			
		} catch (Exception e) {
			System.out.println(e.toString());
		}
		
	}	
	
	public static void main(String[] args) {
		new ServerTest().serverStart();
	}

	@Override
	public void run() {
		//데이터를 받을때 
		
		String str;
		String ip;
		
		try {
			
			if(sc==null)
				return;
			
			InputStream is = sc.getInputStream();
			BufferedReader br = new BufferedReader(new 
					InputStreamReader(is));
			
			//clientIP
			ip = sc.getInetAddress().getHostAddress();
			ta.append("\r\n[" + ip + "] 접속!!");
			
			while((str=br.readLine())!=null) {
				ta.append("\r\n" + str);
			}			
			
		} catch (Exception e) {
			ta.append("\r\n 클라이언트 연결 종료...");
			sc = null;
			ss = null;
		}
		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		//데이터를 보낼때
		
		String str = tf.getText();
		
		if(str.trim().equals("")) {
			return;
		}
		
		if(sc==null) {
			return;
		}
		
		try {
					
			//true:flush
			PrintWriter pw = new PrintWriter(sc.getOutputStream(),true);
			pw.println("서버]" + str); //클라이언트에 전송
			
			ta.append("\r\n서버]:" + str);
			
			tf.setText("");
			tf.requestFocus();
			
		} catch (Exception e2) {
			ta.append("\r\n 클라이언트와 접속이 끊겼습니다...");
			sc = null;
		}
				
	}

}

1대 1 채팅 서버 실행 화면
1대 1 채팅 서버 실행 화면

 


 

벌써 수업을 들은 지 한 달이 다돼간다. 시간이 참 빠르고 난 아직 많이 부족하다는 걸 느낀다. 나는 왕복시간이 3시간  조금 넘게 걸리는데 공부 시간을 확보하기 위해 자취를 하기로 결심했다. 지금도 공부 시간이 부족하면 뒤에 스프링을 배울 때는 더욱 시간이 부족할 것이다. 
반응형

블로그의 정보

무작정 개발

무작정 개발

활동하기