네트워크 기초
LAN (좁은범위) → MAN → WAN (넓은 범위)
WAN : 우리가 흔히 말하는 인터넷
서버 : 서비스를 제공하는 프로그램
클라이언트 : 서비스를 요청하는 프로그램
클라이언트(브라우저) → request(요청) → 서버(웹서비스)
서버 → response(응답) → 클라이언트
IP주소
IP주소는 네트워크 어댑터마다 할당됨
명령 프롬프트에서 ipconfig(IP구성) 명령어를 이용해 ip 주소를 알 수 있음
컴퓨터의 네트워크 어댑터까지만 갈 수 있는 정보
DNS (Domain Name System)
IP 네트워크에서 사용하는 시스템
도메인 이름으로 IP를 등록하는 저장소
도메인주소로 검색 → (DNS) → IP추출
Port번호
운영체제가 관리하는 서버 프로그램의 연결번호
서버
특정 포트번호에 바인딩함
웹 서버 → 80포트
FTP 서버 → 21포트
DBMS →1521 포트
클라이언트
서버에서 보낸 정보를 받기위해서는 포트번호가 필요함
운영체제가 자동으로 부여하는 번호를 사용함
이 번호는 클라이언트가 서버로 요청할 때 함께 전송되어 서버가 클라이언트로 데이터를 보낼 때 사용됨
IP주소 얻기
자바는 IP 주소를 java.net 패키지의 InetAddress로 표현
getHostAddress()
IP주소를 문자열타입으로 리턴함
로컬 컴퓨터의 getLocalHost() 메소드를 이용하여 InetAddress객체를 간접적으로 얻은 후 이용
InetAddress ia = InetAddress.getLocalHost();
String ip = ia.getHostAddress();
인터넷 전송용 프로토콜
TCP(Transmission Control Protocol)
IP와 함께 사용되기 때문에 TCP/IP라고도 부름
연결형 프로토콜 : 상대방이 연결된 상태에서 데이터를 주고받음
ex) 채팅 프로그램
클라이언트 연결 요청 → 서버가 연결 수락 → 통신회선 고정 → 고정회선을 통해 데이터 전달
보낸 데이터가 순서대로 전달되며, 손실이 발생하지 않음
java.net 패키지의 ServerSocket과 Socket 클래스를 이용함
클라이언트는 서버의 IP주소와 Port번호로 연결 요청함
TCP 서버
ServerSocket serversocket = new ServerSocket(포트번호);
// 또는 -----------------------------------------------
//서버의 여러 IP중 특정 IP에서만 서비스를 원할 때
ServerSocket serversocket = new ServerSocket();
serversocket.bind(new InetSocketAddress("IP주소", 포트번호));
package tcpNetworking;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class ServerExample {
private static ServerSocket serverSocket;
public static void main(String[] args) {
System.out.println("-----------------------------------------------------");
System.out.println("서버를 종료하려면 q 또는 Q를 입력하고 Enter 키를 입력하세요.");
System.out.println("-----------------------------------------------------");
startServer();
Scanner scanner = new Scanner(System.in);
while (true) {
String key = scanner.nextLine();
key.toLowerCase();
if (key.equals("q")) {
break;
}
}
scanner.close();
stopServer();
}
public static void startServer() {
Thread thread = new Thread() {
@Override
public void run() {
try {
serverSocket = new ServerSocket(50001);
System.out.println("[서버] 시작됨");
while (true) {
System.out.println("\\n[서버] 연결 요청을 기다림\\n");
Socket socket = serverSocket.accept();
InetSocketAddress isa = (InetSocketAddress) socket.getRemoteSocketAddress();
System.out.println("[서버] " + isa.getHostName() + "의 연결 요청을 수락함");
DataInputStream dis = new DataInputStream(socket.getInputStream());
String message = dis.readUTF();
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeUTF(message);
dos.flush();
System.out.println("[서버] 받은 메세지를 다시 보냄: " + message);
socket.close();
System.out.println("[서버] " + isa.getHostName() + "의 연결을 끊음");
}
} catch (IOException e) {
System.out.println("[서버]" + e.getMessage());
}
}
};
thread.start();
}
public static void stopServer() {
try {
serverSocket.close();
System.out.println("[서버] 종료됨");
} catch (IOException e1) {}
}
}
TCP 클라이언트
package tcpNetworking;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientExample {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 50001);
System.out.println("[클라이언트] 연결 성공");
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeUTF("나는 잔태가 죠앙");
dos.flush();
DataInputStream dis = new DataInputStream(socket.getInputStream());
String message = dis.readUTF();
System.out.println("[클라이언트] 데이터 받음: " + message);
socket.close();
System.out.println("[클라이언트] 연결 끊음");
} catch (UnknownHostException e) {
// IP 표기방법이 잘못되었을 경우
} catch (IOException e) {
// 해당 포트의 서버에 연결할 수 없는경우
}
}
}
JDBC
DB연결
- JDBC Driver 등록
JDBC Driver 클래스를 path에서 찾고, 메모리 로딩
→ 이 과정에서 JDBC Driver 클래스의 static 블록이 실행되면서 DriverManager에 JDBC객체를 등록하게됨
Class.forName("oracle.jdbc.OracleDriver");
- 클래스를 찾지 못할경우 ClassNotFoundException 예외가 발생할 수 있기 때문에 예외처리 해야함
- getConnection() 메소드로 DB와 연결
Connection conn = DriverManager.getConnection("연결 문자열", "사용자", "비밀번호")
// 연결문자열
// jdbc:oracle:thin:@IP주소:포트번호/DB명
- 연결이 실패할 경우 SQLException이 발생하므로 예외처리를 해야함
[전체 코드]
package oracle;
import java.sql.*;
public class ConnectionExample {
public static void main(String[] args) {
Connection conn = null;
try {
Class.forName("oracle.jdbc.OracleDriver");
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@IP주소:포트번호/DB명",
"사용자",
"비밀번호"
);
System.out.println("연결 성공");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
System.out.println("연결끊기");
} catch (SQLException e) {}
}
}
}
}
INSERT문 실행
- String 타입으로 INSERT문 준비하기
- → ?(물음표)를 사용하여 매개변수화된 INSERT문으로 변경할 수도 있음
String sql = new StringBuilder();
sql.append("INSERT INTO users (userid, username, userpassword, userage, useremail)")
.append("VALUES (?, ?, ?, ?, ?)")
.toString();
// 또는 -----------------------------------------------------------------------------
String sql = "" +
"INSERT INTO users (userid, username, userpassword, userage, useremail)" +
"VALUES (?, ?, ?, ?, ?)"
- Connection 클래스의 prepareStatement() 메소드에 매개변수로 INSERT문을 넣은 PreparedStatement 타입의 변수 생성
PreparedStatement pstmt = conn.prepareStatement(sql);
- PreparedStatement 클래스의 Setter메소드를 이용해 ?(물음표) 에 들어갈 값을 지정
- → ?(물음표)는 순서에따라 1번부터 번호가 부여됨
pstmt.setString(1, "winter");
pstmt.setString(2, "한겨울");
pstmt.setString(3, "12345");
pstmt.setInt(4, 25);
pstmt.setString(5, "winter@mycompany.com");
- 값을 지정한 후 executeUpdate() 메소드를 호출하여 SQL 문을 실행
- → executeUpdate() 메소드의 리턴값은 저장된 행 수(int) 임
int rows = pstmt.executeUpdate();
System.out.println("저장된 행 수:" + rows);
- PreparedStatement를 더이상 사용하지 않을 경우에는 close()메소드를 호출해서 메모리 해제 시켜줌
pstmt.close();
[전체 코드]
package oracle;
import java.sql.*;
public class ConnectionExample {
public static void main(String[] args) {
Connection conn = null;
try {
Class.forName("oracle.jdbc.OracleDriver");
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@IP주소:포트번호/DB명",
"사용자",
"비밀번호"
);
System.out.println("연결 성공");
// String sql = "" + "INSERT INTO users (userid, username, userpassword, userage, useremail) " + "VALUES (?, ?, ?, ?, ?)";
String sql = new StringBuilder()
.append("INSERT INTO users (userid, username, userpassword, userage, useremail) ")
.append("VALUES (?, ?, ?, ?, ?)")
.toString();
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "winter");
pstmt.setString(2, "한겨울");
pstmt.setString(3, "12345");
pstmt.setInt(4, 25);
pstmt.setString(5, "winter@mycompany.com");
int rows = pstmt.executeUpdate();
System.out.println("저장된 행 수:" + rows);
pstmt.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
System.out.println("연결끊기");
} catch (SQLException e) {}
}
}
}
}
'Back-End > Java' 카테고리의 다른 글
JDBC(1) (0) | 2023.03.27 |
---|---|
Java 과제 - 성적표 파일 입출력 (0) | 2023.03.23 |
Java(9) (0) | 2023.03.23 |
댓글