국비지원학원/Java

51~52일차

초코맛 2019. 1. 16. 23:58
반응형
*채팅(여러사람이 동시에 메세지를 주고 받을 수 있는)

서버
서버소켓을 열고 accept로 소켓을 받아와
multichatserverhelper에서 inputstream(계속 받아야 함으로 무한루프(쓰레드)) outputStream열어 리스트를 구성하여 다른소켓이 연결되면 똑같이 소켓받고,인풋아웃풋연결.
클라이언트
인풋(무한루프) 아웃풋스트림
서버에 접속하여 Stream을 연결하고, 
사용자의 동작이있을때
메세지를 서버로 보내고,
서버에서 출력되는
메세지를 읽어들인다.

클라이언트도 자기나름의 소켓을 연다.(몇번이 열리는지 아무도 모른다.)

port를 열고, 모든소켓을 받는다.
소켓에서 Stream얻기
모든 소켓에서 입력되는 메세지를 모든 소켓에 출력
클라이언트

1대1은 내창에 올리고 상대방에게 보냈는데, 여러사람과 함께 할때에는 무조건 서버에 올려서 서버가 전체에 뿌려주는것으로 한다.
채팅기능개선(추가) -조별숙제?

Class InetAddress
생성자가 없는클래스가 아님!! =>기본은있다..
없으면 객체화 못해..


~~~~~채팅완성~~~~~

<<<<조별숙제>>>>
server를 thread 로 4개를 동시에 다른port로 열어 client가 4개중 하나를 선택하여 그port를 열고 접속하는 프로그램

ip는 받지않고 고정시켜 접속한다. 


 



*URL Encoder( Uniform/universal resource locator)
  • 문자열 값을 url을(웹의 주소를) 통해 내보낼수 있도록 변경하는 일
  •  
  • 문자열의 값은 2byte 이거나 그 이상.
  • 웹은 tcp ip를 기반으로 하기때문에 신뢰성통신(패킷단위로통신(한패킷=한바이트))
  • 절대로 "가"라는 글자는 갈수 없다.
  • %~시작하는 코드값(16진수0~F)으로 전달(아스키 코드값)
  • 사람이 알아볼수있는 글자를 코드값으로 바꾸어주는걸 인코딩
  • 그 반대를 decoder
  • 사용법)
  • URLEncoder.encode("문자열", "charset명");
  • 원래 이름은?? ISO 885_~
*Lambda
  • JDK1.8에서 부터 제공하는 문법
  • interface를 편하게 사용할 수 있는 기능
    • =>구현클래스를 만들지 않고 사용하는 방법.
  • 함수형 interface만 사용가능.
    • =>추상method가 반드시 하나인 interface(funtional interface)
    • ex)Runnable, actionListener,,,,
  • 문법) 
( )->식; 
( ) 는 추상method header  식부분은 추상method의 구현 body부분.
<심지어 어느경우에는 return도 필요없음.

public interface Test{
   public String getName()
}
public interface Test{
    public void setTest(int i, int j);
}
public interface Test{
     public void temp(int i);
}

===========================>이렇게 된다<============================
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

Test t= ( ) ->"공선의";
t.getName()
Test t=(int i, int j)->System.out.println(i+j);
t.setTest(10,30)하면 사용가능하게 된다.
화살표뒷부분이 body인것.
Test t=(i, j)->S.o.p(i+j);

Test t=(i)->{
      for(int j=0; j<i; j++){
             s.o.p(j);
      }
; <- 꼭 써주어야 함
Thread t= new Thread(()->{    });

t.start(); 면,
( )=>는 run

한줄의 코드는 (간단한) body는 { }를 생략할 수 있다.
간단한 body에서는 return 생략
매개변수가 존재한다면 그대로 정의( 매개변수명은 달라도 상관없다)
매개변수의 데이터형을 생략할수 있다.=>타입추론기능(짐작해서 사용)
method내 복잡할 때엔  { } 사용.
추상인터페이스가 하나의인터페이스를 
SAM(Single Abstract Method)
이라고도 한다.


*JDBC(Java DataBase Connectivity)
  • java와 DBMS를 연동(같이 돌아갈꺼라서) 하는 기술
  • 저수준의 API 제공(개발자가 할게 많음)-(번거로움)(제어할 수 있는게 많아진다) 
  • Driver loading 방식
    • =>Driver가 제공된다면 모든 RDBMS와 연동할 수 있다.
      • =>db제조사(vendor)에서 제작하여 제공.
      • =>type1 driver만 sun사에서 제작하여 제공
        • Type1 Driver : window os에서 DB와 연결(ODBC: open DataBase Connectivity)한 객체를 사용
          • jdbc-odbc bridge Dricer
          • window전용
          • 속도가 가장 느리다, 연결이 편하다.
          • DB연결은 os가 하고 자바는 os랑 붙여 jdbc는 odbc에 붙인다.
          • Driver를 sun사에서 제공.
        • Type2 : Native API Driver : db와 java가 각각 독립적인 연결 프로토콜을 가진 Driver
          • =>구현하는 언어가 다를수 있다.
          • DBMS에 서버소켓이있으면 jdbc가 붙어 읽어들이고 DBMS에서 소켓에서 뻗어나가는 언어가 java가 아닐 수 있다.
          • OCI 드라이버가 가장유명하고 Fat Driver라고도 한다.  :db의 거의 모든기능을 사용 가능(느려) DBMS모든 가능성 사용가능
        • Type3 : Middle ware드라이버 (장비일수도  os 일수도 =>대규모에 사용)
          • 분산시스템
        • Type4 : Net protocol Driver 
          • 순수자바 드라이버
          • db가 소켓을 열어 처리할때 자바언어로 처리 (충돌ㄴ 전달도 잘됨)
          • ex) oracle에 thin Dricer : DBMS의 모든기능을 사용할수는 없다. 필요한 몇가지 기능만 추려놓음. 요거쓸거(프로시저호출은되는데 만들수는 없다...
          • 우리가 쓰게 될것!

      • 제어판-모든제어판항목-관리도구-ODBC데이터 원본>로 쓸수도 os에서 db연결(제일 저질)
      •  Driver는 외부 자르파일로 ext폴더(C:/dev/java/jdk1.8.0_191/jre/lib/ext파일)에 넣거나, class path, build path

    • (폴더에 넣는게 가장구림) -> 패스를설정하지 않아도 쓸수 있다. 간편하나 필요없을때도 실행해 무거워진다. 비추!
    • class path : 자바는 CUI환경에서 쓸때
    • build path : eclipse에서 사용할때.
  • java.sql 패키지에서 관련 class와 interface 를 제공

  • 코딩순서
  • 1. JVM에 드라이버 로딩.
  • 2.DBMS와 연결얻기
  • 3.쿼리문 생성객체 얻기
  • 4.쿼리수행후 결과 얻기
  • 5.연결 끊기

  • class : JVM외부의 클래스를 객체로 만들어 JVM에 올려놓는 일.
    • JVM외부의 클래스=Direver
  • DriverManager : 로딩된 드라이버를 사용하여 DB와 연결한 후 연결객체를 반환하는 일
  • Connection : 연결 관리, Transaction에 관한 처리, 쿼리문 생성 객체 얻는 일
  • Statement, PreparedStatement, CallableStatement : 쿼리문을 실행하여 결과 얻는 일.
    • =>쿼리문을 실행해 결과를 얻지만  Call~은 Procedure실행해 얻는다. (프로시저 : 간접실행 (쿼리문에 넣어 주로 함수넣어 하는것))(직접은 execute 프로시저명 으로 하는것...
  • ResultSet : Cursor의 제어권을 받아 레코드를 조회 할때


*DB연결하여 사용하기

 
1.Driver loading (DB Vendor 사에서 제공)
    Class.forName("oracle.jdbc.OracleDriver");
                                                   =>ojdbc6.jar에 존재.
2.로딩된 드라이버를 사용하여 Coonnection얻기
     String url = "/*회사마다 다 url이 달라..범용아님!*/jdbc:oracle:thin:ipaddress/*127,0,0,1/localhost..등등*/:port/*1521*/:SID/*orcl*/";
     String id ="scott";
     String pass = "tiger";
DBO : db의 주인 owner의 것이어야 함. 
Connection con=DriverManager.getConnection(url,id,pass);
DBMS로 가 인증을 받아 다시 JVM으로돌아와 con을 받는다.

3.쿼리문 생성 객체 얻기
     Statement smt=con.createStatement();
4.쿼리문 실행 후 결과 얻기
     String sql="insert into 테이블명 values('1','2','3')";
     int cnt =stmt.executeUpdate(sql);
     if(cnt==1){
        S.o.p("추가성공");
     }
변경과, 변경하지 않는애..
변경: create, drop, trunctae, alter, grant, revoke, commit, rollback : 결과가 boolean 이라 execute(String sql)
         insert, update, delete : sql%rowcount 결과는 항상 몇행이 수행되었다고 나옴 executeupdate() 실행시 행의 수가 나온다.
변경하지 않는 : select : exevuteQuery() 실행시 ResultSet반환.

5.연결 끊기
     if(statement!=null) { stmt.close(); }
     if(con!=null) { con.close(); }


*eclipce 에서 DataBase를 보려면~

-Quantum database Utility (Sorceforge에서 설치)

-저장이 안된다는 단점!

*Database연결

-eclipce에서는 프로젝트의 properties-java Build Path-Libraries-add External jars로 ojdbc6.jar를등록시킨다. 

이건 빌드패스로 이클립스에서만 가능하고 도스창에서는 안된다.

-Dos창에서는 bat파일에 path를 추가하고 나니 잘됨!

*쿼리문 실행 객체

Statement
: 쿼리문을 모른다.(쿼리문이 실행될때 쿼리문을 알게된다.)
실행할 때마다 쿼리문이 매번 생성되어 실행된다.
bind변수 x
SQL Injection이 발생할 수 있다.
(매년 거의 1위하는 공격)
항상느린것은 아니고, 쿼리문이 한번만(적은 횟수로) 실행될때 얘가 더빨라진다.
총한번을 쏘기 위해 다 하나하나 조립해 쏘는거고



공통 : 
자바코드에서 쿼리문 작성 에는 ;(세미콜론) 을 넣지 않는다!  넣으면 Error
PreparedStatement
: 쿼리문을 안다.(객체가 얻어질 때 부터)
쿼리문은 미리 생성되어있고, 값만 넣어서 실행한다.
bind변수 존재
SQL Injection이 발생할 수 없다.
쿼리문이 반복실행 될때 속도가 빠르다.
탄창만 넣어서 쏘는것으로 훨씬 빠름.




CallableStatement
: Procedure실행




반응형

'국비지원학원 > Java' 카테고리의 다른 글

54일차  (0) 2019.01.19
53일차  (0) 2019.01.17
47일차~50일차  (0) 2019.01.15
44~46일차  (0) 2019.01.14
43일차  (0) 2018.12.20