[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);
}
}
}
}
주소를 찾아가서 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 : 채팅 서버 클래스
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;
}
}
}
벌써 수업을 들은 지 한 달이 다돼간다. 시간이 참 빠르고 난 아직 많이 부족하다는 걸 느낀다. 나는 왕복시간이 3시간 조금 넘게 걸리는데 공부 시간을 확보하기 위해 자취를 하기로 결심했다. 지금도 공부 시간이 부족하면 뒤에 스프링을 배울 때는 더욱 시간이 부족할 것이다.
반응형
'Language > Java' 카테고리의 다른 글
[JAVA + 국비교육] Java 팀 프로젝트(자판기) | 소스 코드, 실행 영상, 느낀 점 (0) | 2022.01.19 |
---|---|
[JAVA+국비교육] XML파일 읽어오기, 정규화 표현식 (0) | 2022.01.17 |
[JAVA+국비교육] Event (이벤트) (0) | 2022.01.13 |
[JAVA+국비교육] 입출력 Stream (0) | 2022.01.12 |
[JAVA+국비교육] Thread (0) | 2022.01.11 |
블로그의 정보
무작정 개발
무작정 개발