* Singleton Pattern (싱글턴 패턴)

 특정 클래스의 객체가 1개만 유지되도록 하는 디자인패턴

 - 특정 클래스의 객체가 하나만 만들어지고 어디서든 그 객체에 접근할 수 있음



* 싱글턴 패턴 만들기

 1 . 생성자를 외부에서 호출하지 못하도록 private으로 숨김

 2 . 객체를 대신 말들어주는 함수를 만듦

 2-1 . 2의 함수가 처음불릴때는 새로 만든 객체주고, 두번째부터 첨에 만든거 재탕

 2-2 . 2-1 재탕을 할려면 처음 만든 객체를 어딘가에 저장해둬야됨.


 1. 외부에서 자유롭게 객체를 생성하지 못하도록 생성자를 private으로 감춤

 2. 1개 유지될 객체를 저장할 참조 변수 선언

 3. 2에 대한 getter를 만들되 2가 null일때 객체 생성


 1. 생성자를 private으로

 2. 자기자신의 참조변수를 static으로 선언

 3. 2에대한 getter를 작성하되 2가 null일때 2에 객체 생성


* 테이블의 제약조건

 - 기본키 제약조건 : 해당 컬럼의 값은 null일 수 없고, 모든 레코드간에 유일한 값이어야함

 - not null 제약조건 : 해당 컬럼의 값은 null 일 수 없음

 - unique 제약조건 : 해당 컬럼의 값은 모든 레코드간에 유일한 값이어야함

 - 외래키 제약조건 : 다른 테이블의 기본키를 참조하는 컬럼으로 참조하고 있는 테이블의 기본키 컬럼에 존재하는 값 만이 이 컬럼에 담길 수 있음.

 - check 제약조건 : 해당 컬럼에 담길 수 있는 값의 범위 혹은 데이터셋을 제한

  

{컬럼명} 성질 primary key ->기본키 설정


select password('a') from dual ;  -> 해쉬값을 뽑아주는 password 함수, 비밀번호는 테이블에 그냥 저장하면 보안위험.


SHA - 1 알고리즘이 해쉬의 결과가 160bit 그래서 40글자의 16진수로 이뤄진 결과가 나옴



DB 

로직

 저장해야 될 DATA

 

 테이블

 

 퀴리문 나열

 pw 이름 email 가입일

 가입 insert into [테이블명] (컬럼,컬럼,컬럼...)

 이름으로 조회 select * from [테이블명] where name;

 로그인 select pw from [테이블명] where id = ;

          select password( ' ? ' ) from dual ; 

 DAO

 




정규 표현식(正規表現式, 영어: regular expression, 간단히 regexp 또는 regex) 또는 정규식(正規式)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있으며, 특히 과 Tcl은 언어 자체에 강력한 정규 표현식을 구현하고 있다.

이메일 주소

^[0-9a-zA-Z_\-]+@[.0-9a-zA-Z_\-]+$
^[0-9a-zA-Z_\-]+@[0-9a-zA-Z_-]+(\.[0-9a-zA-Z_\-]+)*$
^[0-9a-zA-Z_\-]+@[0-9a-zA-Z_\-]+(\.[0-9a-zA-Z_\-]+){1,2}$
^[0-9a-zA-Z]([\-.\w]*[0-9a-zA-Z\-_+])*@([0-9a-zA-Z][\-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9}$

    

 



' IOT 기반 응용 SW과정 > Java, Eclipse ' 카테고리의 다른 글

Day30 DAO  (0) 2016.04.27
Day29 JDBC(Java Database Connectivity)  (0) 2016.04.26
Day28 MySQL  (0) 2016.04.25
Day27 MySQL  (0) 2016.04.22
Day 26 데이터베이스 프로그래밍  (0) 2016.04.21

Model 클래스 :  2000대 초반까지는 VO라고 불렀음 (StudentVO)

         // DTO라고도 불렀음(StudentDTO)


DAO (Data Access Object)


import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.List;


public class StudentDao {

private Connection connection;

private static final String USERNAME = "root";

private static final String PASSWORD = "mysql";

private static final String URL = "jdbc:mysql://localhost:3306/lkb";

public StudentDao(){ //여기서 connection객체를 생성해서 디비에 연결

try{

Class.forName("com.mysql.jdbc.Driver");

connection = DriverManager.getConnection(USERNAME,PASSWORD,URL);

}catch (ClassNotFoundException e) {

e.printStackTrace();

System.out.println("클래스 적재 실패");

} catch (SQLException e) {

e.printStackTrace();

System.out.println("연결 실패");

}

}

public void insertStudent(Student student){

String sql = "insert into student values (?,?,?)";

PreparedStatement pstmt = null;

try{

pstmt = connection.prepareStatement(sql);

pstmt.setInt(1, student.getId());

pstmt.setString(2, student.getName());

pstmt.setInt(3, student.getGrade());

pstmt.executeUpdate();

}catch(SQLException e){

e.printStackTrace();

}finally{

try{

if(pstmt != null && pstmt.isClosed())

pstmt.close();

}catch(SQLException e){

e.printStackTrace();

}

}

}

public void updateStudent(Student student){

//id에 해당하는 레코드를 찾아서 name과 grade를 매개변수로 받은 값으로 수정

String sql = "update student set name=?, grade=? where id=?";

PreparedStatement pstmt = null;

try{

pstmt = connection.prepareStatement(sql);

pstmt.setString(1, student.getName());

pstmt.setInt(2, student.getGrade());

pstmt.setInt(3, student.getId());

pstmt.executeUpdate();

}catch(SQLException e){

e.printStackTrace();

}finally{

try{

if(pstmt != null && pstmt.isClosed())

pstmt.close();

}catch(SQLException e){

e.printStackTrace();

}

}

}

public void deleteStudent(int id){

//유일한 컬럼값인 id가 매개변수 id에 해당하는 레코드를 삭제

String sql = "delete from student where id=?";

PreparedStatement pstmt = null;

try{

pstmt = connection.prepareStatement(sql);

pstmt.setInt(1, id);

pstmt.executeUpdate();

}catch(SQLException e){

e.printStackTrace();

}finally{

try{

if(pstmt != null && pstmt.isClosed())

pstmt.close();

}catch(SQLException e){

e.printStackTrace();

}

}

}

public Student selectOne(int id){

//유일한 컬럼값인 id가 매개변수 id에 해당하는 레코드를 조회

String sql = "select * from student where id = ?";

PreparedStatement pstmt = null;

ResultSet rs = null;

Student student = null; //리턴할 객체참조변수

try{

pstmt = connection.prepareStatement(sql);

pstmt.setInt(1, id);

rs =  pstmt.executeQuery();

if(rs.next())

{

student = new Student();

student.setId(rs.getInt("id"));

student.setName(rs.getString("name"));

student.setGrade(rs.getInt("grade"));

}

}catch(SQLException e){

e.printStackTrace();

}finally{

try{

if(pstmt != null && !pstmt.isClosed())

pstmt.close();

if( rs != null && !rs.isClosed())

pstmt.close();

}catch(SQLException e){

e.printStackTrace();

}

}

return student;

}

public List<Student> selectAll(){

String sql = "select*from student";

PreparedStatement pstmt = null;

ResultSet rs = null;

List<Student> studentList = new ArrayList<Student>();

try{

pstmt = connection.prepareStatement(sql);

rs = pstmt.executeQuery();

while(rs.next())

{

Student student = new Student();

student.setId(rs.getInt("id"));

student.setName(rs.getString("name"));

student.setGrade(rs.getInt("grade"));

studentList.add(student);

}

}catch(SQLException e){

e.printStackTrace();

}finally{

try{

if( pstmt != null && !pstmt.isClosed())

pstmt.close();

if( rs != null && !rs.isClosed())

pstmt.close();

}catch(SQLException e){

e.printStackTrace();

}

}

return studentList;

}

}


' IOT 기반 응용 SW과정 > Java, Eclipse ' 카테고리의 다른 글

Day31 Singleton Pattern  (0) 2016.04.28
Day29 JDBC(Java Database Connectivity)  (0) 2016.04.26
Day28 MySQL  (0) 2016.04.25
Day27 MySQL  (0) 2016.04.22
Day 26 데이터베이스 프로그래밍  (0) 2016.04.21

자바 코드를 이용해  //   JDBC(Java Database Connectivity)

-DB에 접속하고

-DBMS에 명령어를 전달하고

-DBMS로부터 질의결과를 얻어오기


파일 입출력 기능

java.io.~~~~


네트워크 기능

java.net.~~~~


JDBC 기능

java.sql.~~~~   // 

여기에는 어떻게 JDBC가 구현될지 인터페이스만 있고 실제 DBMS에 접속해서 활용하는 기능들은 각각의 DBMS에 구현클래스를 만들어서 배포


외부 라이브러리를 프로젝트에 import하기


Maven Repository: Search/Browse/Explore      -> 초대형 무료라이브러리 저장소

mvnrepository.com/




import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.Statement;


//Class 로딩

//DBMS의 특정 DB와 연결을 갖는 Connection객체 획득

//내가 날릴 쿼리문을 품은 Statement객체 생성

//Connection객체에  Statement구문 객체를 전달

public class CreateTableTest {

public static void main(String[] args) {

Connection conn = null;

Statement stmt = null;

//연결한 DBMS의 주소(디비명까지)

String url = "jdbc:mysql://localhost:3306/lkb";

//접속할 mysql id와 비밀번호

String id = "root";

String pw = "mysql";

try {

Class.forName("com.mysql.jdbc.Driver");

conn = DriverManager.getConnection(url,id,pw);

stmt = conn.createStatement(); // DB와 연결된 conn 객체로 부터 구문 객체를 획득

StringBuilder sb = new StringBuilder();

sb.append("create table student(")

.append("id int,")

.append("name varchar(20),")

.append("grade int")

.append(");").toString();

stmt.execute(""); //구문객체 던지기

//execute -> 테이블 생성, 수정, 삭제 등 데이터 베이스 관리 명령어 사용

//executeUpdate -> 레코드 삽입, 수정, 삭제 등 데이터 조작 명령어 사용

//executeQuery -> 레코드 조회, 테이블 조회 등 조회 명령어 사용

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();}

finally{

try {

if(conn != null && !conn.isClosed())

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}}}}


' IOT 기반 응용 SW과정 > Java, Eclipse ' 카테고리의 다른 글

Day31 Singleton Pattern  (0) 2016.04.28
Day30 DAO  (0) 2016.04.27
Day28 MySQL  (0) 2016.04.25
Day27 MySQL  (0) 2016.04.22
Day 26 데이터베이스 프로그래밍  (0) 2016.04.21

정렬

select * from {테이블명} order by {컬럼명} ;  -> 오름차순 정렬

select * from {테이블명} order by {컬럼명} desc ;  -> 내림차순 정렬


문자함수

upper, lower, intcap

select {컬럼명}, upper(컬럼명), lower(컬럼명), intcap(컬럼명) from employee ;


날짜

sysdate() <- 현재 날짜를 구하는 함수

select sysdate() from dual ;   ------------->dual = dummy 테이블


길이

length함수

select length('    ') from dual ; -> ' ' 내의 바이트의 길이를 알려줌

select char_length('    ') from dual ; -> 순수한 문자의 길이


붙이기 = concat

select concat ('붙' , '이기') from dual ;  


substr (문자열, 시작위치 ,가져올 갯수) 

select substr('abcdefghij', 4, 3) from dual ;  -> def

select substr('abcdefghij', -4 ,3) from dual ; -> ghi   >> 음수면 오른쪽부터 시작 위치 선정   

select substr('abcdefghij',  3) from dual ;    -> cdefghij >>3번째부터 전부

select substr('abcdefghij',  -3) from dual ;   -> hij >> 뒤에 3번째부터 전부


그룹함수 : 테이블의 전체 데이터(혹은 특정 조건을 만족하는 데이터 집합)에서 통계적인 결과를 구하는 함수들

-> 그룹함수는 하나이상의 행을 그룹으로 묶어 연산하여 하나의 결과를 구함

 sum, avg, count, max, min

select sum(컬럼명) as '  ' from {테이블명} ; 

select avg(컬럼명) as '  '  from {테이블명} ;

select max(컬럼명) as '  ' from {테이블명} ;

select min(컬럼명) as '  ' from {테이블명} ;

null 값은 무시;


distinct -> 중복값 제거

select distinct 컬럼명 from {테이블명};

select count(distinct 컬럼명) from {테이블명};


select 컬럼명 from {테이블명} where 컬럼명 = (select max(컬럼명) from {테이블명}) ;


데이터 그룹 사용하기 

select 컬럼명1, avg(컬럼명) from {테이블명} group by 컬럼명1 ;


직업이 MANAGER가 아닌 친구들에 대해 직업별로 그루핑해서 직업과 그룹별레코드수 ,그룹변 sal총합을 구하고

그중에서 sal총합이 5000보다 작으면 없애버리고 sum(sal) 기준으로 오름차순 정렬


select * from {테이블1}, {테이블2} ; -> 두개의 테이블을 같이 조회                               join

select * from employee e, dept d ; 

select * from employee, dept where e.deptno = d.deptno ;

select * from employee, dept where employee.deptno = dept.deptno ;

select * from employee e join dept d using(deptno);

select * from employee e join dept d on e.deptno = d.deptno;


self join -> 자기 자신과 자기 자신을 합치는거



insert into {테이블명} (튜플값) value (입력값) -> 입력


select {column명,column명....} -> from {테이블명} 테이블내 특정 column 조회

select * from {테이블명}  -> 테이블 내의 모든 데이터 조회

select {컬럼,컬럼,컬럼,,,,} from {테이블명} where 조건 -> where절을 활용한 select 문


delete from {테이블명} -> 테이블 내의 모든 데이터 삭제

varchar값 찾을때 ' ' 


비교연산자

= 같다

> 크다  >=

< 작다  <=

 다르다 <>, != , ^=


and, or, not

select {컬럼,컬럼,컬럼,,,,} from {테이블명} where 조건 and 조건

select {컬럼,컬럼,컬럼,,,,} from {테이블명} where 조건 not조건

select {컬럼,컬럼,컬럼,,,,} from {테이블명} not where 조건


between -> 특정 컬럼의 데이터값이 하한값, 상한값 사이에 포함되는 레코드를 조회할때 사용

select {컬럼,컬럼,컬럼,,,,} from {테이블명} where {} between 000 and 000;

select {컬럼,컬럼,컬럼,,,,} from {테이블명} where {} between date and date;

select {컬럼,컬럼,컬럼,,,,} from {테이블명} where {} not between              ;


in -> 특정 컬럼의 값이 A,B,C 중에 하나라도 일치되면 참

where {column} in ( val1, val2, val3 ... );

where {column} not in ( val1, val2, val3 ... );


null값은 연산자체가 안됨.

is null -> null인지 확인

is not null -> null이 아닌지 확인


like -> 문자값 확인

select * from {테이블명} where {컬럼} like ' ' ;

select * from {테이블명} where {컬럼} like 'S%' ; -> S로 시작하는            // % -> 0글자 이상의 어떤 문자들

select * from {테이블명} where {컬럼} like '%S%' ; -> S가 포함되는 

select * from {테이블명} where {컬럼} not like '%S%' ; -> S가 포함되지 않은

select * from {테이블명} where {컬럼} like '_S%' ;  -> 두번째 글자가 S인    


산술연산

select 컬럼, 컬럼, 컬럼 (*) 숫자 from {테이블명}; ->컬럼에 숫자 곱한값

select 컬럼, 컬럼, 컬럼 ifnull(컬럼,0) from {테이블명}; -> 컬럼값이 널이면 0으로 


as (생략가능 : '' 필수)

select 컬럼 as 바꿀컬럼명 from {테이블명};

select 컬럼 as '띄어쓰기있는 컬럼명' from {테이블명}; -> 띄어쓰기있는 별칭은 따옴으로 묶어 줘야됨


레코드 수정 , 삭제

update {테이블명} set 컬럼명=값, 컬럼명=값 where 영향받을 레코드의 조건

delete from {테이블명} where 삭제할 레코드의 조건

리눅스

Ubuntu -> 개인


redhat 리눅스

-> RHEL (7) * 서버

-> Cent (7) 

-> Fedora (8?)




리눅스포털

https://www.linux.co.kr/
한국의 리눅스 포털 Linux.co.kr 무료 메일 계정, 리눅스 자료 제공.


Apache Tomcat® 

tomcat.apache.org/


Paint.NET - Free Software for Digital Photo Editing

www.getpaint.net/
Paint.NET is free image and photo editing software for computers that run Windows.


Stack Overflow

stackoverflow.com/


A language-independent collaboratively edited question and answer site for programmers.


MySQL

https://www.mysql.com/


The software's official homepage with news, downloads and documentation.

Begin Your Download - mysql-installer-web-community-5.7.12.0.msi

데이터베이스


관계형 데이터베이스는 데이터를 여러 개의 테이블에 나누어서 저장한다

DBMS ))) 오라클, SQL Server, 사이베이스, MySQL


MySQL:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

show databases; -> db확인

#create database {db이름};  -> db생성

#drop database {db이름}; -> db삭제

use {db 이름}; -> db접속


create table {table명}{      -> 테이블 생성

{컬럼명}{컬럼명}{option...}.

{컬럼명}{컬럼명}{option...}.

{컬럼명}{컬럼명}{option...}.

{컬럼명}{컬럼명}{option...}

};


show tables -> 테이블 확인

desc {테이블명} -> 테이블의 필드구조 확인


' IOT 기반 응용 SW과정 > Java, Eclipse ' 카테고리의 다른 글

Day28 MySQL  (0) 2016.04.25
Day27 MySQL  (0) 2016.04.22
Day24 GUI 그래픽 사용자 인터페이스 // 이벤트 처리  (0) 2016.04.19
Day23 TCP  (0) 2016.04.18
Day22 TCP  (0) 2016.04.12

GUI

1세대 : AWT(Abatract Windows Toolkit) -> OS로부터 그래픽 자원을 빌려 씀

2세대 : Swing -> 자바 내부적으로 그래픽 자원 지원

3세대 : FX 



패널(panel)은 컴포넌트들을 가질 수 있는 컨테이너

레이블은 편집이 불가능한 텍스트



이벤트 처리 과정

1. 이벤트가 발생할 컴포넌트를 생성

2. 원하는 이벤트를 처리하는 리스터 인터페이스를 구현

3. 1번 컴포넌트에 2번객체를 연결





import java.awt.*;

import javax.swing.*;


class MyFrame extends JFrame {

private JButton btn;

private JLabel label;   //컴포넌트들을 Frame클래스의 멤버변수로 선언

private JTextField tF;

public MyFrame(){

btn = new JButton();

label = new JLabel("달러값 입력");

btn = new JButton();

btn = new JButton();

btn.setText("환전");

tF = new JTextField(5);

this.add(tF);

this.add(btn);

this.add(label);


btn.addActionListener(new MyListener());

//이벤트 처리 구현 클래스의 객체를 컴포넌트에 연결

setTitle("MyFrame");

setSize(300,200);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setLayout(new FlowLayout());

setVisible(true);

}

class MyListener implements ActionListener{

public void actionPerformed(ActionEvent e){

// System.out.println("그만눌러");

try{

String money =  tF.getText();

int num = Integer.parseInt(money);

// num++;

int result = num*1142;

String result2 = String.valueOf(result+"원");

label.setText(result2);

}catch(NumberFormatException e1){

// e1.printStackTrace();    }

// ((JButton) e.getSource()).setText("눌렸다");

} //리스너 구현클래스가 프레임 클래스의 내부로 들어가면 프레임의 멤버변수인 

}  // 컴포넌트들에 접근이 자유롭다.

}

public class MyFrameTest {

public static void main(String[] args) {

MyFrame f = new MyFrame();

}

}



이벤트 처리기의 위치 

1) 별도의 클래스로 이벤트 처리기를 작성

2) 내부클래스로 이벤트 처리기를 작성

3) 프레임 클래스가 이벤트 처리기도 함께 구현

' IOT 기반 응용 SW과정 > Java, Eclipse ' 카테고리의 다른 글

Day27 MySQL  (0) 2016.04.22
Day 26 데이터베이스 프로그래밍  (0) 2016.04.21
Day23 TCP  (0) 2016.04.18
Day22 TCP  (0) 2016.04.12
Day21 입출력 / 네트워크 프로그래밍  (0) 2016.04.11

C&P : Copy & Paste - 복사 & 붙여넣기

: 널리고 널린 것들을 충분히 활용하고,


D&C : Divide & Conquer - 분할 & 정복

: 나눠서 조금씩 정복해 나가고,


C&I : Creative & Idleness - 창조적 게으름

: 게을러지되 창조적이어라.




import java.io.*;

import java.net.ServerSocket;

import java.net.Socket;


public class TcpServer {

public static void main(String[] args) {

ServerSocket serverSocket = null;

Socket socket = null;

BufferedReader br = null;

BufferedWriter bw = null;

try{

//server는 프로그램이 실행되면 연결요청을 기다림 포트 5001

serverSocket = new ServerSocket(5001);

socket = serverSocket.accept(); //문장형태의 문자열을 주고 받을수 있도록 세팅;

InputStream in = socket.getInputStream();

OutputStream out = socket.getOutputStream();

br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

   bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

   //server는 client가 연결되면 '이름을 입력하세요'라고 메시지를 전송

   bw.write("이름을 입력하세요\n");

   bw.flush(); // server는 client가 보낸 이름을 변수에 저장, 

   String clientName = br.readLine();

   //계속해서 client가 보내는 메시지를 수신,모니터에 출력

   while(true)

   {

    String msg = br.readLine();

    if(msg.equals("quit"))//client가 보낸 메시지가 quit일 경우 프로그램 종료

    break;

    System.out.println(clientName + " : " + msg); 

   }

}catch(IOException e){

e.printStackTrace();

}}}


ctrl  + shift + o -> 클래스 임포트 정리


import java.io.*;

import java.net.*;

public class TcpClient {

public static void main(String[] args) {

Scanner scan = new Scanner(System.in);

System.out.println("연결할 IP주소를 입력하세요");

String ipAddr = scan.nextLine();  //client는 프로그램이 실행되면 사용자로부터 ip주소를 입력받아

Socket socket = null; 

BufferedReader br = null;

BufferedWriter bw = null;

try{ //해당 주소의 5001포트로 tcp 연결 요청을 보냄

socket = new Socket(InetAddress.getByName(ipAddr),5001);

//문장형태의 문자열을 주고 받을 수 있도록 세팅

InputStream in = socket.getInputStream();

OutputStream out = socket.getOutputStream();

br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

   bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

        //client는 연결이 성공하면 서버가 보낸 메시지를 모니터에 출력

System.out.println(br.readLine());

//그 다음부터 사용자로부터 계속해서 메시지를 입력받아서 받을때마다 서버에게 전달

while(true){

String msg = scan.nextLine();

bw.write(msg+ "\n";

bw.flush();

}

}catch(UnknownHostException e){

e.printStackTrace();

}catch(IOException e){

e.printStackTrace();

}}}


TCP 통신하기


서버

1. 포트번호를 적어서 ServerSocket 객체 생성

2. ServerSocket 객체의 accept()메소드 호출

3. 클라이언트로부터 연결요청이 들어오면 2의 결과로 socket객체가 반환됨

4. socket 객체로부터 inputStream과 outputStream을 얻어서 읽고 쓰기 수행

(서버소켓만들어서 어셉트 대기하다가

소켓객체 만들어지면

인풋스트림 아웃풋스트림을 각각 

버퍼드리더 버퍼드 롸이터로 가공해서

롸이터에 안녕 클라이언트야? 라고 출력 한 후에

리더로 들어오는 메시지를 기다리다가 읽히면 모니터에 출력 )


클라이언트

1. 서버와 아이피와 포트정보를 이용해 Socket 객체 생성

2. 1이 성공하면 Socket 객체로부터 inputStream과 outputStream을 얻어서 읽고 쓰기 수행

(클라이언트

클라이언트는 서버와 연결이 되면

소켓으로부터 인풋,아웃풋 만들어서 버퍼드리더롸이터로 가공해서 리더로부터

들어오는 값을 읽어서 모니터출력

롸이터를 통해 그래 안녕 서버야 라고 출력 )


' IOT 기반 응용 SW과정 > Java, Eclipse ' 카테고리의 다른 글

Day24 GUI 그래픽 사용자 인터페이스 // 이벤트 처리  (0) 2016.04.19
Day23 TCP  (0) 2016.04.18
Day21 입출력 / 네트워크 프로그래밍  (0) 2016.04.11
Day20 입출력  (0) 2016.04.08
Day19 스레드  (0) 2016.04.07

try 구문 밖에서 사용할 스트림 객체 참조변수 선언 

try 구문 안에서 스트림 객체 생성 및 사용(읽기,쓰기) 

finally 구문안에서 사용한 스트림 close


InputStream

read()

read(byte[] b)

read(byte[] b, int off, int length)


OutputStream

write(int a)

write(byte[] a)

write(byte[] b, int off, int length)



import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;


public class FileReaderTest {

public static void main(String[] args) {

BufferedReader in = null;

BufferedWriter out = null;

try{

out = new BufferedWriter(new FileWriter("data.txt"));

out.write("꿈에 미치면 신화가 된다");

out.append(".");

out.flush();

in = new BufferedReader(new FileReader("data.txt"));

// int c;

// while( (c = in.read()) != -1)

// System.out.print((char) c);

String msg = null;

while ((msg = in.readLine()) != null)

System.out.println(msg);

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if (in != null)

in.close();

if (out != null)

out.close();

} catch (IOException e) {

e.printStackTrace();

}}}}




보조 스트림


문자 변환 보조 스트림

바이트스트림 -> InputStreamReader -> 문자스트림

문자스트림 -> OutputStreamWriter -> 바이트스트림




import java.io.BufferedReader;//import java.io.BufferedWriter; //import java.io.FileInputStream;

import java.io.FileReader; //import java.io.FileWriter; //import java.io.IOException;

import java.io.InputStreamReader; //import java.util.Scanner;


public class Test {

public static void main(String[] args) {

Scanner scan = new Scanner(System.in);

// BufferedReader in = null;

BufferedWriter writer = null;


try {

writer = new BufferedWriter(new FileWriter("log.txt"));// 스트림 객체 생성


while (true) {

System.out.println("기록할 내용을 입력 : ");

String msg = scan.nextLine();

if (msg.equals("quit"))

break;

writer.write(msg + "\n");// 이 코드를 사용자가 quit를 입력할때까지 반복

}

writer.flush();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if (writer != null)

writer.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}



·서버(Server): 사용자들에게 서비스를 제공하는 컴퓨터

·클라이언트(Client): 서버에게 서비스를 요청해서 사용하는 컴퓨터

·DNS(Domain Name System): 숫자 대신 기호를 사용하는 주소
·DNS 서버: 기호 주소를 숫자 주소가 변환해주는 서버
·URL(Uniform Resource Locator): 인터넷 상의 자원을 나타내는 약속

·포트(port): 가상적인 통신 선로
*데이터를 받는 쪽은 포트를 열고 대기 // <- 프로그램이 OS로부터 포트를 점유 
 데이터를 보내는 쪽은 상대방의 IP,port를 목적지로 데이터를 전달 // IP,port<- 데이터를 송수신하기 위한 정보의 집합(Socket)
 자바에서 ip는 InetAddress라는 타입의 자료형으로 분리

·프로토콜(protocol): 통신을 하기 위한 약속

·TCP(Transmission Control Protocol)는 신뢰성있게 통신하기 위하여 먼저 서로 간에 연결을 설정한 후에 데이터를 보내고 받는 방식
·UDP(User Datagram Protoocol)는 데이터를 몇 개의 고정 길이의 패킷(다이어그램이라고 불린다)으로 분할하여 전송





import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

import java.net.UnknownHostException;


public class UdpSender {

public static void main(String[] args) {

try {

InetAddress ip = InetAddress.getByName("70.12.109.114");

//UDP전송 순서 // 소켓 생성 // 보낼 데이터를 바이트 배열로 준비 

//준비한 바이트 배열을 목적지 주소와 목적지 포트 번호를 포함해 패킷으로 준비

//소켓을 통해 패킷 전송

DatagramSocket socket = new DatagramSocket();

//데이터를 받고자 할때는 소켓 생성자에 사용할 포트번호 기재

//보내기만 할때는 안써도 됨//안쓰면 내부적 임시포트 받아씀

String msg = "안녕 UDP로 데이터를 보내는거야";

byte[] buf = msg.getBytes();

DatagramPacket packet = new DatagramPacket(buf,buf.length,ip,5000);

socket.send(packet);

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (SocketException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}



import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.SocketException;

//UDP데이터 수신하기

//수신할 포트를 적어서 소켓 생성

//수신할 데이터가 저장될 빈 바이트 배열을 준비

//수신할 데이터가 저장될 빈 패킷을 위 배열과 연결해서 준비

//소켓에 준비한 빈 패킷을 담아 수신

public class UdpReceiver {

public static void main(String[] args) {
try{
DatagramSocket socket = new DatagramSocket(5000);

byte[] buf = new byte[512];

DatagramPacket packet = new DatagramPacket(buf,buf.length);

System.out.println("수신을 기다리는중......");

socket.receive(packet);

System.out.println("수신완료");

System.out.println(new String(buf));

}catch(SocketException e){

e.printStackTrace();

}catch(IOException e){

e.printStackTrace();
}
}

}



SVN(subversion) : 프로젝트 협업 관리 도구

' IOT 기반 응용 SW과정 > Java, Eclipse ' 카테고리의 다른 글

Day23 TCP  (0) 2016.04.18
Day22 TCP  (0) 2016.04.12
Day20 입출력  (0) 2016.04.08
Day19 스레드  (0) 2016.04.07
Day18 예외처리  (0) 2016.04.06

+ Recent posts