Echo System?

  • 자바의 소켓을 이용하여 채팅(멀티캐스팅)을 구현하기 위한 기초적인 학습!
  • 단순히, 내가 보낸 메시지를 내가 받아서 콘솔에 메아리치는(Echo) 프로그램 
  • 클라이언트는 Telnet을 사용

1) Telnet 기능 켜기

- 윈도우사용자의 경우, 제어판으로 들어가 Windows 기능 켜기/끄기를 눌러 Telnet 클라이언트를 체크한다음 확인을 눌러준다.

 

2) 서버 구현

  

  • 자신이 원하는 클래스명으로 클래스 생성
  • 하나의 클래스에서 실행을 하기 위해 main메서드 생성
  • ServerSocket 인스턴스를 사용하기 위해 멤버변수 생성
  • 포트번호는 1~1024번까지는 이미 시스템이 점유하므로 점유불가! 

 

 

 

 

 

 

 

 

 

 

  • ServerSocket은 서버를 열어놓고 accept()메서드를 이용하여 접속자가 들어올 때까지 Block상태로 대기한다.

 

 

 

 

 

 

  • ServerSocket으로부터 accpet()된 요청의 클라이언트와 메시지를 주고받기 위해선 Socket객체를 반환받아야한다.
  • Socket객체로부터 InputStream을 반환받아 클라이언트로부터 보낸 메시지를 콘솔창에 뿌릴 수 있다.

 

 

 

 

 

 

package day1109.echo;

import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer2 {
	ServerSocket server;
	int port = 9999;

	public EchoServer2() {
		try {
			server = new ServerSocket(port);
			System.out.println("서버 소켓 생성완료!");
			
			Socket socket = server.accept();
			System.out.println("접속자 발견!");
			
			//반환받은 소켓을 이용하면, 현재 접속자에 대한 정보를 구할 수 있다.
			InetAddress inet = server.getInetAddress();
			String ip = inet.getHostAddress();
			System.out.println(ip);
			
			//클라이언트가 보낸 메시지 받기!! 
			//(메시지를 받는 것은 실행중인 프로그램으로 데이터가 들어오는 것이므로
			//입력 스트림으로처리해야한다!!)
			//소켓으로부터 스트림을 뽑아낼 수 있다!
			InputStream is =socket.getInputStream();//바이트기반(한글깨짐, 영문만)
			
			int data=1;
			while(data!=10) {
				System.out.print((char)data);//1byte읽어들임...
			}
			socket.close();
			server.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new EchoServer2();
	}
}

cf. ServerSocket과 Socket의 차이는? 

ServerSocket : 말그대로 서버 프로그램에서만 사용하는 소켓이다. 서버소켓은 클라이언트로부터 연결 요청이 오기를 기다렸다가 연결 요청이 들어오면 클라이언트와 연결을 맺고 다른 소켓을 만드는 일을 한다.

Socket : 서버에 접속하기 위한 클라이언트를 구현는 사용하는 클래스

 

'프로그래밍 > Java' 카테고리의 다른 글

java - mail 보내기  (0) 2021.01.06
싱글톤 패턴 알아보기  (0) 2020.12.14
JavaFX - 개발환경 구축 및 생명주기  (0) 2020.11.23
Java - JSON & XML 파싱  (0) 2020.11.17
Java - JDBC(Java DataBase Connectiviy) 사용법  (0) 2020.11.05

JDBC란?

자바에서는 데이터베이스 연동하는 기술을 가리켜 JDBC(Java DataBase Connectiviy)라고 하며,

Java.sql 패키지에서 API가 지원된다!

연동 절차

1) DB기종에 알맞는 드라이버를 로드 (oracle용, mysql용, mssql용.. 각각 jar가 필요)
2) 접속
3) 원하는 쿼리 수행
4) 접속해제 (특히, 스트림 및 DB는 사용 후 반드시 해제하자!!!)

1) DB기종에 알맞는 드라이버를 로드 (oracle용, mysql용, mssql용.. 각각 jar가 필요)

- 오라클일 경우

오라클을 설치한 폴더로 찾아가 .jar파일을 가져온다

ex) oracle\product\11.2.0\server\jdbc\lib

 

자신의 java 버전에 따라 가져와서 사용한다! (나는 6을 사용했다)

jar파일을 사용하고 있는 프로젝트의 추가를 해준다!

 

- MySQL(MariaDB)일 경우

MavenRepository에 들어가서 jdbc를 검색하여 .jar파일로 다운받는다!

그 다음은 , 오라클과 다를게 없다~

 

이제 코드로 가서, Class.forName() 메소드를 이용하여 드라이버를 로드한다!

Class.forName("oracle.jdbc.driver.OracleDriver");//오라클의 경우
Class.forName("com.mysql.cj.jdbc.Driver");//MySQL의 경우

2) 접속

DriverManger(DBMS에 접속하여 Connection 인스턴스받아주는 클래스)를 이용하여 Conncection(접속된 데이터베이스의 정보를 가지고 있는 인터페이스) 인터페이스의 인스턴스를 반환받자!

Connection con=null;	
 			//jdbc:DBMS기종:방식:ip주소:포트번호:기기의 DBMS설치명
String url="jdbc:oracle:thin:@localhost:1521:XE"; //Oracle 경우
			//jdbc:DBMS기종:ip주소:(포트번호):database명
String url = "jdbc:mysql://localhost:/exdatabase"; //MySQL 경우
String user="";
String password="";
con=DriverManager.getConnection(url, user, password); //접속시도!!

3) 원하는 쿼리 실행

- SELECT의 경우

PreparedStatement pstmt; // 쿼리문 수행 객체, 인터페이스이므로 new로 생성하는 것이 아니라
// 접속객체인 Connection 객체로부터 인스턴스를 얻올 수 있다.
ResultSet rs;// select 쿼리문 수행결과에 의해 표가 반환되는데, 이떄 이 표를 담는 객체
String sql = "select * from emp";

pstmt = con.prepareStatement(sql); // Connection객체로부터 PerparedStatement인스턴스얻기
rs = pstmt.executeQuery();// select문의 경우엔 executeQuery() 이용해야한다..
//rs에는 표가 들어있다!! 따라서 원하는 레코드로 커서를 옮기자!!
            
while(rs.next()) { //데이터가 존재하면, 한칸 전진 후 true까지 반환
	rs.getString("컬럼명"); //테이블의 컬럼명을 통해 가져올 수 있다
    rs.getInt("컬럼명2") //반환받는 데이터의 자료형에 따라 메서드가 다르다!
}

- INSERT, UPDATE, DELETE의 경우

  • INSERT의 경우의 성공 시 1, 실패 시 0 
  • UPDATE, DELETE의 경우엔 성공 시 UPDATE, DELETE된 행들의 수만큼, 실패 시 0
PreparedStatement pstmt; // 쿼리문 수행 객체, 인터페이스이므로 new로 생성하는 것이 아니라
// 접속객체인 Connection 객체로부터 인스턴스를 얻올 수 있다.
ResultSet rs;// select 쿼리문 수행결과에 의해 표가 반환되는데, 이떄 이 표를 담는 객체
String sql = "select * from emp";

pstmt = con.prepareStatement(sql); // Connection객체로부터 PerparedStatement인스턴스얻기
int result = pstmt.executeUpdate();//DML(insert, update, delete) 쿼리 실행 시 이 메서드(executeUpdate())를 사용함
if(result!=1){
System.out.println("insert 실패");
}else{
System.out.println("insert 성공");
}

4) 접속해제 (특히, 스트림 및 DB는 사용 후 반드시 해제하자!!!) 

if(rs!=null) {
  try {
    	rs.close();
    	System.out.println("rs 연결해제");
  	} catch (SQLException e1) {
    	e1.printStackTrace();
  	}
  }
if(pstmt!=null) {
  try {
    	pstmt.close();
    	System.out.println("pstmt 연결해제");
    } catch (SQLException e1) {
    	e1.printStackTrace();
    }
  }
if(con!=null) {
	try {
  	con.close();
  	System.out.println("con 연결해제");
  } catch (SQLException e1) {
 	 e1.printStackTrace();
  }
}

원하는 쿼리 실행한 뒤에, 반드시 !!!! 접속을 해제시켜줘야한다!! 

Database Server는 동시에 연결가능한 횟수에 제한을 두고 있기 때문에 사용하지 않을 때는 닫아야 한다!!

'프로그래밍 > Java' 카테고리의 다른 글

java - mail 보내기  (0) 2021.01.06
싱글톤 패턴 알아보기  (0) 2020.12.14
JavaFX - 개발환경 구축 및 생명주기  (0) 2020.11.23
Java - JSON & XML 파싱  (0) 2020.11.17
Java - 소켓프로그래밍 기초 Echo System  (0) 2020.11.09

예를 들기 위해 만든 Excel에 있는 데이터

1) Excel데이터를 .csv의 확장명으로 파일을 만든다.

SQLLDR에 명령시킬 ctl 파일

2) SQLLDR 에게 시킬 명령을 나열한 파일을 .ctl확장 파일로 만든다.

load data 

infile 'animal.csv' => DB에 넣을 데이터

insert into table animal(테이블명) ※ 해당 파일을 넣을 테이블(animal)이 있어야하며, 테이블은 빈 테이블이여한다.

fields terminated by ',' => 각 필드에 구분자

(code, category, name, location) => 테이블의 컬럼명's

 

두 파일을 같은 폴더에 위치시킨다.

csv와 ctl파일이 있는 디렉터리로 이동한 뒤,

SQLLDR 유저id/pw control='만든.ctl파일명' data='넣을 데이터 csv파일명'

※ 해당 파일을 넣을 테이블이 있어야하며, 테이블은 빈 테이블이여한다.

 

성공 화면
실제 animal테이블을 조회

 

'프로그래밍 > oracle' 카테고리의 다른 글

oracle 11g express edition 다운로드  (0) 2020.08.26

+ Recent posts