TCP
Transmission Control Protocol ( 전송 제어 규약 )
Server : TCP, Web(tomcat), Database
* 종단시스템
- host 네트워크 상에서 더이상 연장되지 않는 시스템
- PC, Smart phone, Scanner, Printer
* Router
- 하드웨어
- host간의 상호 데이터를 교환할 수 있도록 하는 장비
- 각각의 컴퓨터는 모두 router를 가짐. router를 통해 인터넷 통신을 진행.
* Inter Network : 포괄적인 통신망
* 통신 규약
TCP (Transmission Control Protocol) | UDP (User Datagram Protocol) |
동기 통신 | 비동기 통신 |
신사적인 protocol, 신뢰할 수 있는 규약 상대방과의 연결이 먼저 이뤄진 후 데이터 교환 ex ) 전화 |
비 연결형 protocol, 연결확인 하지 않음 ex ) 편지, 지상파 방송 |
동기화 : send → recv 처리 순서가 맞아야 한다 | |
데이터의 경계가 없다.(용량 제한이 없다) | 데이터의 경계가 있다. (용량 제한 있다) |
채팅, object 전송 | 1 : 1 통신(unicast) 1 : 다 통신(broadcast) 다 : 다 통신(multicast) |
속도 느림 | 속도 빠름 |
* 7 layer
- 계층 - Physical Layer (물리계층)
- 계층 - Data Link Layer (주소를 헤더에 첨부하는 계층)
- 계층 - Network Layer (네트워크 IP -> Address)
- 계층 - Transport Layer (네트워크 port)
- 계층 - Session Layer (세션을 동기화)
- 계층 - Presentation Layer (보안, 압축, 확장)
- 계층 - Application Layer (프로그램)
* 네트워크 용어
- Packet (묶음) : 데이터 묶음. → 제어정보, 데이터(문자열, object) 가 결합된 형태로 전송
- IP (Internet Protocol) : 목적지 주소
- IPv4 : xxx.xxx.xxx.xxx → 0 ~ 255
- IPv6 : xxx.xxx.xxx.xxx.xxx.xxx
- 127.0.0.1 : 자기 자신을 접속할 수 있는 주소
- Port number : 각각의 process를 구분할 수 있는 번호. IP 주소는 InterNet에 존재하는 host(PC) 를 식별할 수 있으나 최종 주체인 프로세스(프로그램)를 식별하지 못하기 때문에 프로세스를 구별하기 위해서 지정된 수치(0 ~ 1024)외의 숫자를 지정한다.
- DNS (Domain Name System) server
- Socket : 통신의 주체. 통신 하기 위한 object. IP, TCP/UDP의 정보를 가지고 있다.
socket 통신 순서
순서 | server | client |
1 | Socket 버전 확인 | Socket 버전 확인 |
2 | Binding -> IP, Port | |
3 | Listener (서버 항상 돌아가야함) | |
4 | Accept <------------------------------- | Connect |
(1) | recv <------------------------------- | send (write) |
(2) | send --------------------------------> | recv (read) |
recv, send 를 별도의 thread로 두어 Accept 상태를 유지한다. multi-thread의 상태를 유지한다.
더보기
쿠키 VS 세션 VS 캐시
쿠키 : 로컬 컴퓨터에 서버에서 받은 데이터를 저장한 파일. 비교적 보안이 낮다. ex) 자동로그인
세션 : 서버에서 유저의 인증상태 등을 임시로 저장한 파일. 비교적 보안이 높다. 다소 느리지만 로그 관리에 용이하다.
캐시 : 리소스 파일의 임시 저장소. 다시 사용될 확률이 있는 데이터들을 빠르게 접근 가능한 저장소에 저장한다.
=> 페이지 로딩 속도를 개선함
Practice
(Server)
package main;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import threadex.ServerThread;
public class MainClass {
public static void main(String[] args) {
Socket clientSocket = null;
try {
// 문지기 Socket
ServerSocket serverSocket = new ServerSocket(9000);
// 버전 확인, binding, listener 포함
List<Socket> list = new ArrayList<Socket>();
while (true) {
System.out.println("접속 대기중...");
clientSocket = serverSocket.accept();
list.add(clientSocket);
// 접속 client 확인
System.out
.println("client IP : " + clientSocket.getInetAddress() + " Port : " + clientSocket.getPort());
new ServerThread(clientSocket, list).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
- MainClass
package threadex;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.List;
import java.util.Scanner;
public class ServerThread extends Thread {
Scanner scanner = new Scanner(System.in);
Socket socket;
List<Socket> list;
public ServerThread(Socket socket, List<Socket> list) {
this.socket = socket;
this.list = list;
}
@Override
public void run() {
super.run();
try {
while (true) {
// 수신(recv)
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str = reader.readLine();
System.out.println("client로부터 받은 메시지: " + str);
// 송신(send)
for (Socket s : list) {
if (socket != s) {
PrintWriter writer = new PrintWriter(s.getOutputStream());
writer.println(str);
writer.flush();
}
}
Thread.sleep(300); // 0.3sec
}
} catch (Exception e) {
System.out.println("연결 끊긴 IP: " + socket.getInetAddress());
list.remove(socket);
// 남은 접속 클라이언트 출력
for (Socket s : list) {
System.out.println("접속 되어있는 IP: " + s.getInetAddress() + " Port: " + s.getPort());
}
try {
socket.close();// ?
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
- ServerThread
(Client)
package main;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;
import threadex.ReadThread;
public class MainClass {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 1. 접속 해야할 Server IP(주소)를 설정 -> socket 설정
InetSocketAddress sockAddr = new InetSocketAddress("192.168.0.105", 9000);
// 2. Socket 생성
Socket socket = new Socket();
// 3. Connect
try {
socket.connect(sockAddr, 10000); // 10초동안 서버 못 찾으면 끊어라
InetAddress inetAddress;
if ((inetAddress = socket.getInetAddress()) != null) {
System.out.println("서버 접속 성공!");
} else {
System.out.println("서버 접속 실패~");
}
new ReadThread(socket).start();
while (true) {
// 4. Packet 송수신
System.out.print("[보낼메시지]: ");
String str = scanner.next();
// 송신(send)
PrintWriter writer = new PrintWriter(socket.getOutputStream());
writer.println(str);
writer.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
- MainClass
package threadex;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.List;
public class ReadThread extends Thread {
Socket socket;
public ReadThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
while (true) {
// 수신(recv)
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str = reader.readLine();
System.out.println("server로부터 받은 메시지: " + str);
Thread.sleep(300);
}
} catch (Exception e) {
}
super.run();
}
}
- ReadThread
'JAVA' 카테고리의 다른 글
JAVA Network Practice (0) | 2022.06.13 |
---|---|
JAVA GUI - AWT (0) | 2022.06.13 |
JAVA 기초 - Design Pattern (0) | 2022.06.10 |
JAVA 기초 - 상속, final, static, Abstract, Interface, Collection (0) | 2022.06.09 |
JAVA 기초 - Exception, Calendar, Class (0) | 2022.06.08 |