본문 바로가기

JAVA

JAVA Network- TCP/IP

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

  1. 계층 - Physical Layer (물리계층)
  2. 계층 - Data Link Layer (주소를 헤더에 첨부하는 계층)
  3. 계층 - Network Layer (네트워크 IP -> Address)
  4. 계층 - Transport Layer (네트워크 port)
  5. 계층 - Session Layer (세션을 동기화)
  6. 계층 - Presentation Layer (보안, 압축, 확장)
  7. 계층 - 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)

 

socket 통신

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