Archive

2021-01-20 TIL

|

2021-01-20 TIL


  • 오늘 한 것
    1. 개인 프로젝트 프로토콜 채팅 구현 - 프로토콜을 활용해서 귓속말, 입장, 퇴장 등이 가능한 채팅기능을 구현했다. 이제 스레드상에서의 자잘한 버그들을 해결하고 안정화 작업에 들어가야겠다.
    2. 학원 비대면 수업(15:30~22:00) oracle 활용



  • 내일 할 것
    1. 개인 프로젝트 - 2차 완성
    2. 자바 네트워크 활용 공부
    3. 학원 비대면 수업(15:30~22:00)



  • 끝으로

내일이 최종

오늘의 한 줄 총평 : 내일이 최종


2021-01-19 TIL

|

2021-01-19 TIL


  • 오늘 한 것
    1. 개인 프로젝트 엑셀저장, 채팅GUI, 네트워크 연결 - Apache POI 라이브러리를 써서 재고목록을 엑셀로 저장하는건 비교적 쉽게 끝냈다. 문제는 채팅 프로그램 구현인데.. 일단 GUI까지는 다 만들었고 관리자 모드와 클라이언트 모드에서 서로 채팅이 되는것까지는 했는데 음… 뭔가 허전한 감이 있다. 귓속말 기능 같은걸 넣어서 비밀채팅이 되도록 해봐야겠다.
    2. 학원 비대면 수업(15:30~22:00) oracle CRUD - 자바에서 동적 쿼리문을 작성하는 방법과 오라클 DB를 활용하여 간단히 CRUD 하는 방법을 배웠다.
    3. 블로그 포스팅 (Java Day 24,25) - 채팅창 프로그램을 만들기 위해 자바에서 네트워크 활용하는 법을 공부해서 포스팅했다.



  • 내일 할 것
    1. 개인 프로젝트 - 채팅 기능 완료
    2. 자바 네트워크 활용 공부
    3. 학원 비대면 수업(15:30~22:00)



  • 끝으로

오늘 꽤나 진전이 많았다. 원래 목표였던 1차 완성을 지나서 여러 기능들을 추가적으로 넣고 있다. 채팅기능까지 구현이 끝나면 리팩토링해서 최종 완성을 해야겠다.

오늘의 한 줄 총평 : 고지가 보인다


Java Day 25 네트워크(2)

|

Java Day 25 네트워크(2)


  1. Unicasting

    • 클라이언트와 서버의 1:1 통신 개념을 unicast라고 한다.
    • unicasting 채팅 구현
    /**
    *	서버는 스레드를 생성하여 클라이언트와 통신하는 소켓을 유지해야함
    *	각각의 스레드가 개별 클라이언트와 통신 할 수 있도록 구현
    */
       
    // Server
       
    import java.io.*;
    import java.net.*;
       
    public class UnicastServer {
    	public UnicastServer() {
    		ServerSocket ss = null;
    		try {
    			ss = new ServerSocket(5001);
    		} catch(IOException e) {
    			System.out.println("해당 포트가 사용중입니다.");
    			System.exit(0);
    		}
    		try {
    			while(true) {
    				System.out.println("서버 대기중");
    				Socket s = ss.accept();
    				// 클라이언트와 채팅할 스레드 생성
    				UnicastServerThread thread = 
    						new UnicastServerThread(s);
    				thread.start();
    			}
    		} catch(IOException e) {
    			e.printStackTrace();
    		}
    	}
    	public static void main(String[] args) {
    		new UnicastServer();
    	}
    }
    
    // Thread
       
    import java.io.*;
    import java.net.*;
       
    public class UnicastServerThread extends Thread {
    	Socket s = null;
    	BufferedReader br = null;
    	BufferedWriter bw = null;
       	
    	// 객체 생성시 서버의 소켓을 받아서 저장
    	public UnicastServerThread(Socket s) {
    		this.s = s;
    	}	
    	@Override
    	public void run() {
    		// 스트림 연결
    		try {
    			br = new BufferedReader(new InputStreamReader(s.getInputStream()));
    			bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
       			
    			while(true) {
    				// 클라이언트가 전달한 메세지 수신
    				String msg = br.readLine();
    				System.out.println(msg);
       				
    				// 클라이언트에게 메세지 전송
    				bw.write(msg+"\n");
    				bw.flush();
    			}
    		} catch(IOException e) {
    			InetAddress ip = s.getInetAddress();
    			String address = ip.getHostAddress();
    			System.out.println("["+address+"] 와의 연결이 끊어졌습니다.");
    		}
    	}
    }
    
    // Client
       
    import java.io.*;
    import java.net.*;
       
    public class UnicastClient {
    	Socket s = null;
    	BufferedReader br = null;
    	BufferedWriter bw = null;
    	BufferedReader keyboard = null;
       	
    	public UnicastClient() {
    		try {
    			s = new Socket("localHost", 5001);
    		} catch(UnknownHostException e) {
    			System.out.println("서버를 찾을 수 없습니다.");
    			System.exit(0);
    		} catch(IOException e) {
    			System.out.println("서버와 연결할 수 없습니다.");
    			System.exit(0);
    		}
       		
    		try {
    			// keyboard와 연결된 스트림 얻기
    			keyboard = new BufferedReader(
    					new InputStreamReader(System.in));
    			bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
    			br = new BufferedReader(new InputStreamReader(s.getInputStream()));
       			
    			// 소켓으로부터 스트림 얻기
    			while(true) {
    				// 키보드 입력
    				System.out.print("전송할 메세지 : ");
    				String msg = keyboard.readLine();
       				
    				// 메세지 서버로 전송
    				bw.write(msg+"\n");
    				bw.flush();
       				
    				// 서버에세 메세지 수신
    				String getMsg = br.readLine();
    				System.out.println("수신 메세지 : "+getMsg);
    			}
    		} catch(IOException e) {
    			System.out.println("서버와의 연결이 끊어졌습니다.");
    			System.exit(0);
    		}
    	}
    	public static void main(String[] args) {
    		new UnicastClient();
    	}
    }
    


  2. Multicasting

    • 서버와 클라이언트의 일대 다 통신을 multicast라고 한다.
    • multicast는 서버가 클라이언트로부터 받은 정보를 모든 클라이언트에게 전송함으로서 서로가 정보를 공유하도록 구현한 것이다.
    • multicast의 서버는 해당 클라이언트와 통신하기 위해 생성된 스레드를 저장할 Collection이 필요하다.
    • multicast의 클라이언트는 자신이 서버로 전송한 정보나 다른 클라이언트가 서버로 전송한 메세지를 수신하기 위한 수신전용의 스레드가 필요하다.
    • Multicasting 채팅 구현
    /**
    * Server
    * 모든 클라이언트의 연결요청을 받아서 socket을 생성하고 thread를 생성한다.
    * 생성된 thread를 Collection에 저장한다.
    */
       
    import java.io.*;
    import java.net.*;
    import java.util.*;
       
    public class MulticastServer {
    	private ArrayList<MultiServerThread> clientList = new ArrayList<>();
    	private ServerSocket ss = null;
       	
    	public MulticastServer() {
    		try {
    			ss = new ServerSocket(5002);
    			System.out.println("서버 대기중");
    			while(true) {
    				Socket s = ss.accept();
    				InetAddress ip = s.getInetAddress();
    				String address = ip.getHostAddress();
    				System.out.println(address+" 접속");
    				// 스레드 객체 생성
    				MultiServerThread t = new MultiServerThread(clientList, s);
    				t.start();
    				// 생성된 스레드를 리스트에 저장
    				clientList.add(t);
    			}
    		}catch(IOException e) {
    			System.out.println(e.getMessage());
    		}
    	} 
    	public static void main(String[] args) {
    		new MulticastServer();
    	}
    }
    
    // Server Thread
       
    import java.io.*;
    import java.net.*;
    import java.util.ArrayList;
       
    public class MultiServerThread extends Thread {
    	private Socket s;
    	private BufferedReader in;
    	private PrintWriter out;
    	private ArrayList<MultiServerThread> clientList;
       	
    	public MultiServerThread(ArrayList<MultiServerThread> clientList, Socket s) {
    		this.s = s;
    		this.clientList = clientList;
    	}
    	@Override
    	public synchronized void run() {
    		try {
    			in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    			out = new PrintWriter(s.getOutputStream());
    			while(true) {
    				String msg = in.readLine();
    				broadCasting(msg);
    			}
    		} catch(IOException e) {
    			clientList.remove(this);
    			String ip = s.getInetAddress().getHostAddress();
    			try {
    				broadCasting(ip+"와의 연결이 끊어졌습니다.");
    			} catch(IOException ioe) {
    				ioe.printStackTrace();
    			}
    		}
    	}
        // 접속자 모두에게 메세지 전송
    	public void broadCasting(String msg) throws IOException {
    		for (MultiServerThread t : clientList) {
    			t.sendMsg(msg);
    		}
    	}
        // 메세지 전송 메소드
    	public void sendMsg(String msg) throws IOException {
    		out.println(msg);
    		out.flush();
    	}
    }
    
    // Client
       
    import java.io.*;
    import java.net.*;
       
    public class MulticastClient {
    	private Socket s;
    	private BufferedReader in;
    	private PrintWriter out;
    	private BufferedReader keyboard;
       	
    	public MulticastClient() {
    		try {
    			s = new Socket("localhost", 5002);
    			System.out.println("서버 접속 성공");
    			keyboard = new BufferedReader(new InputStreamReader(System.in));
    			out = new PrintWriter(s.getOutputStream(),true);
    			in = new BufferedReader(new InputStreamReader(s.getInputStream()));
       			
    			MultiClientThread t = new MultiClientThread(in);
    			t.start();
    			while(true) {
    				String msg = keyboard.readLine();
    				out.println(msg);
    			}
    		} catch(UnknownHostException e) {
    			e.printStackTrace();
    		} catch(IOException e) {
    			e.printStackTrace();
    		}
    	}
    	public static void main(String[] args) {
    		new MulticastClient();
    	}
    }
    
    // Client Thread
       
    import java.io.*;
       
    public class MultiClientThread extends Thread {
    	private BufferedReader in;
       
    	public MultiClientThread(BufferedReader in) {
    		this.in = in;
    	}
    	@Override
    	public void run() {
    		try {
    			while(true) {
    				String msg = in.readLine();
    				System.out.println("수신 메세지 : "+msg);
    			}
    		} catch(IOException e) {
    			e.printStackTrace();
    		}
    	}
    }
    




참고 자료


이것이자바다

자바프로그래밍100% 실전가이드

KG아이티뱅크 자바 강의자료

Java Day 24 네트워크

|

Java Day 24 네트워크


  1. InetAddress 클래스

    • InetAddress 클래스는 IP 주소를 표현한 클래스이다.
    • 자바에서는 모든 IP 주소를 InetAddress 클래스로 사용한다.
    • 기본 생성자의 접근 제한자가 default이기 때문에 new 객체를 생성할 수 없다.
    • 따라서, 객체를 생성해주는 5개의 static 메소드를 제공하고 있다.
    • 이 메소드들은 반드시 UnknownHostException 예외 처리를 해야한다.

    생성메소드


    • 주요 메소드

    주요메소드


    import java.net.*;
       
    public class IdnetAddressEx {
       
    	public static void main(String[] args) {
    		//InetAddress는 ip정보와 Host정보를 가지는 객체
    		//InetAddress객체는 static 메소드를 이용해 생성
    		try {
    			//Host이름에 해당되는 ip정보를 가진 InetAddress객체 얻기
    			InetAddress ipInfo1 = InetAddress.getByName("www.daum.net");
       			
    			//ip주소 얻기
    			String ip = ipInfo1.getHostAddress();
    			System.out.println("ip 주소 : "+ip);
       			
    			//Host이름에 해당되는 ip정보를 가진 모든 InetAddress객체 얻기
    			InetAddress[] ipArray = InetAddress.getAllByName("www.daum.net");
    			for(InetAddress temp : ipArray) {
    				System.out.println(temp);
    			}
       			
    			//현재 컴퓨터의 ip정보를 가진 InetAddress객체 얻기
    			InetAddress myHost = InetAddress.getLocalHost();
    			System.out.println("Host : "+myHost.getHostName());
    			System.out.println("Host ip : "+myHost.getHostAddress());
    		} catch(UnknownHostException e) {
    			e.printStackTrace();
    		}
    	}
    }
       
    /**
    실행결과 : 
    	ip 주소 : 203.133.167.16
    	www.daum.net/203.133.167.16
    	www.daum.net/211.231.99.80
    	Host : DESKTOP-xxxxxx
    	Host ip : 192.xxx.xxx.x
    */
    


  2. URL 클래스

    • URL(Uniform Resource Locater)는 인터넷에서 접근 가능한 자원의 주소를 표현하는 형식
    • 자바의 URL 클래스는 final이라 상속하여 사용할 수 없다.
    • 모든 생성자는 MalformedURLException 예외처리를 해야한다.
    • 생성자

    생성자


    • 주요 메소드

    주요메소드


    import java.io.*;
    import java.net.*;
       
    public class UrlEx {
       
    	public static void main(String[] args) {
    		BufferedReader br = null;
    		try {
    			//url 객체로부터 여러 정보들을 얻을 수 있다
    			URL url = new URL("http://daum.net/index.html");
    			System.out.println("프로토콜 : "+url.getProtocol());
    			System.out.println("호스트 : "+url.getHost());
    			System.out.println("포트번호 : "+url.getPort());
    			System.out.println("경로 : "+url.getPath());
    			System.out.println("파일 : "+url.getFile());
                   
    			//보안상의 이유로 출력이 안될 수 있다
    			br = new BufferedReader(new InputStreamReader(url.openStream()));
    			String str = null;
    			while((str = br.readLine()) != null) {
    				System.out.println(str);
    			}
    		} catch(MalformedURLException e) {
    			e.printStackTrace();
    		} catch(IOException e) {
    			e.printStackTrace();
    		} finally {
    			try {if(br!=null)br.close();}catch(IOException e) {}
    		}
    	}
    


  3. URLConnection 클래스

    • URLConnection 클래스는 원격 자원에 접근하는데 필요한 정보를 가지고 있다.
    • URL 클래스는 원격 서버 자원의 결과만을 가져오지만, URLConnection 클래스는 원격 서버 자원의 결과와 원격 서버의 헤더 정보를 가져올 수 있다.
    • 주요 메소드

    주요메소드


    import java.net.*;
    import java.io.*;
       
    public class URLConnectionEx {
       
    	public static void main(String[] args) {
    		BufferedReader br = null;
    		try {
    			URL url = new URL("http://www.kgitbank.co.kr");
    			URLConnection uc = url.openConnection();
    			uc.connect();
    			String str = null;
    			br = new BufferedReader(new InputStreamReader(uc.getInputStream()));
    			while((str = br.readLine())!= null) {
    				System.out.println(str);
    			}
    		} catch(MalformedURLException e) {
    			e.printStackTrace();
    		} catch(IOException e) {
    			e.printStackTrace();
    		} finally {
    			try {if(br!=null)br.close();}catch(IOException e) {}
    		}
    	}
    }
    


  4. socket 클래스

    • 자바에서는 소켓을 이용해 네트워크 통신을 한다.
    • TCP/IP 계층의 TCP를 지원하기 위해서 Socket, ServerSocket 클래스를 제공하고 있다.
    • 클라이언트는 Socket 객체를 생성하여 TCP 서버와 연결을 시도한다.
    • 서버는 SocketServer 객체를 생성하여 TCP연결을 청취하여 클라이언트와 연결한다.
    • 생성자

    생성자

    • 호스트를 찾을 수 없거나, 서버의 포트가 열려있지 않은 경우 UnknownHostException 발생
    • 네트워크 실패, 방화벽으로 인해 서버에 접근할 수 없는 경우 IOException 발생


  5. ServerSocket 클래스

    • ServerSocket 클래스가 TCP 서버 소켓을 의미한다.
    • 클라이언트의 TCP 연결을 받기 위해서는 java.net.ServerSocket 클래스의 객체를 생성해야한다.
    • ServerSocket 클래스는 네트워크 통신을 수행하기 위해 클라이언트의 TCP 요청에 대한 Socket 객체를 생성하는 역할을 한다.
    • 클라이언트의 TCP 요청이 오면 accept() 메소드를 실행해 클라이언트와 통신할 수 있는 TCP 소켓을 반환한다.
    • 다른 클라이언트의 요청이 있기까지 accept() 메소드는 대기상태에 들어간다.
    • 클라이언트의 소켓과 서버에서는 accept() 메소드로 반환한 소켓으로 스트림을 생성하여 통신한다.
    • ServerSocket 생성자는 TCP 포트번호를 매개변수로 받는다.
    • 기존의 TCP 포트번호가 사용중이라면 IOException이 발생한다.
    • 주요 메소드

    주요 메소드


    /**
    * Server
    */
       
    import java.net.*;
    import java.io.*;
       
    public class EchoServer {
    	public EchoServer() {
    			// 1. 서버소켓 생성
    		try {
    			ServerSocket ss = new ServerSocket(5000);
    			System.out.println("서버 대기중");
    			// 2. 클라이언트의 요청 대기
    			Socket s = ss.accept();
    			System.out.println("클라이언트 연결 - 소켓 생성");
       			
    			// 접속한 클라이언트 정보 얻기
    			InetAddress ia = s.getInetAddress();
    			String ip = ia.getHostAddress();
    			System.out.println("["+ip+"] 접속");
       			
    			// 3. 소켓으로부터 Input,OutputStream 얻기
    			InputStream is = s.getInputStream();
    			OutputStream os = s.getOutputStream();
    			BufferedReader br = new BufferedReader(new InputStreamReader(is));
    			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
       		
    			// 4. 클라이언트가 전송한 메세지 읽기
    			String message = br.readLine();
    			System.out.println("[메세지] : "+message);
       			
    			// 5. 클라이언트에게 메세지 전송하기
    			bw.write("["+ip+"] 님 환영합니다.\n");
    			bw.flush();
    		} catch (IOException e) {
    			// 지정한 포트번호가 사용중일시 예외 발생
    			System.out.println("해당 포트번호는 사용중입니다.");
    		}	
    	}
    	public static void main(String[] args) {
    		new EchoServer();
    	}
    }
    
    /**
    * Client
    */
       
    import java.io.*;
    import java.net.*;
       
    public class EchoClient {
    	public EchoClient() {
    		try {
    			// 1. 서버와 통신할 소켓 생성
    			Socket s = new Socket("localHost", 5000);
       			
    			// 2. 소켓으로부터 input,outputStream 얻기
    			OutputStream os = s.getOutputStream();
    			InputStream is = s.getInputStream();
    			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
    			BufferedReader br = new BufferedReader(new InputStreamReader(is));
       			
    			// 3. 서버에 메세지 전송하기
    			bw.write("나는 클라이언트다.\n");
    			bw.flush();
       			
    			// 4. 서버가 보낸 메세지 받기
    			String message = br.readLine();
    			System.out.println("[서버가 보낸 메세지] : "+message);
    		} catch(UnknownHostException e) {
    			// ip에 해당하는 서버를 찾을 수 없는 경우
    			System.out.println("서버를 찾을 수 없습니다.");
    		} catch(IOException e) {
    			// 해당 포트번호에 어떤 서비스도 존재하지 않는 경우
    			System.out.println("사용할 수 없는 포트번호입니다.");
    		}	
    	}
    	public static void main(String[] args) {
    		new EchoClient();
    	}
    }
    




참고 자료


이것이자바다

자바프로그래밍100% 실전가이드

KG아이티뱅크 자바 강의자료

2021-01-18 TIL - 개인 프로젝트 1차 완성

|

2021-01-18 TIL - 개인 프로젝트 1차 완성


  • 오늘 한 것
    1. 개인 프로젝트 차트 마무리 - 우여곡절 끝에 일차목표인 POS GUI 구현, DB와의 연동, 데이터를 활용한 차트 구현이 모두 끝이 났다. 이제 제법 POS다운 면모를 갖추게 되었다. 10~11일 정도걸렸나..? 원래 학원에서 주어지는 개인 프로젝트의 개발 기간은 14일이다. 혼자 일찍 시작한 프로젝트지만 개발기간은 지켜야겠다고 생각하여 이 기간은 넘기지 않을 예정이다. 아직 여유기간이 몇일 있으므로 채팅 프로그램 혹은 재고 목록을 pdf 등 파일 형식으로 저장할 수 있는 기능 등을 구현해보려고 한다. 단지 자바 몇 일 배운것만 가지고 무턱대고 시작한 프로젝트지만 온갖 정보들을 찾아가며, 또 공부하며 알게된 것들이 참 많았다. 글로 혹은 이론으로만 배워서 스스로도 정리가 안되었던 두루뭉실했던 개념들이 직접 코딩으로 경험하는 동안에 많이 정리가 되었다.
    2. 학원 비대면 수업(15:30~22:00) oracle-jdbc 연동 활용 - 학원에서 DB를 배우기 전에 개인 프로젝트를 진행하며 데이터베이스를 경험했던지라 이해가 잘 됐다. 혼자 할 때는 무턱대고 썼던 코드 한 문장 한 문장이 ‘이래서 여기서 이걸 썼군’ 이라고 느껴지는 순간이었다.



  • 내일 할 것
    1. 개인 프로젝트 - 기능 추가
    2. 자바 네트워크 활용 공부
    3. 학원 비대면 수업(15:30~22:00)- jdbc 동적 쿼리문 활용



  • 끝으로

완성을 목전에 두고 쉬고 싶다는 생각이 부쩍 많이 든다. 우선 최선을 다해 완성을 하고 마음을 추스르고 다음 스텝을 준비해야겠다. 최근엔 개인 프로젝트의 완성에만 매달려있어서 다른 공부를 못했었기에 얼른 리액트 공부할 준비도 하고 주말엔 알고리즘도 공부하고 블로그 포스팅도 많이많이 해야지.

오늘의 한 줄 총평 : 개인 프로젝트는 폭업 사냥터같은 느낌?