반응형
*채팅(여러사람이 동시에 메세지를 주고 받을 수 있는)
서버
서버소켓을 열고 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실행 |
|
|
반응형