상세 컨텐츠

본문 제목

[JAVA] 네트워크 프로토콜

JAVA

by 미로910 2024. 5. 24. 16:18

본문

네트워크 프로토콜이란?

네트워크 프로토콜은 네트워크에서 데이터를 교환하기 위한 규칙과 절차의 집합이다.

프로토콜은 데이터 형식, 순서, 오류 제어 등을 정의하여 서로 다른 시스템 간의 통신을 가능하게 한다.

주요 프로토콜

  1. HTTP (HyperText Transfer Protocol): 웹 페이지를 전송하기 위한 프로토콜이다.
  2. TCP (Transmission Control Protocol): 신뢰성 있는 데이터 전송을 보장하는 프로토콜이다.
  3. UDP (User Datagram Protocol): 신뢰성보다는 빠른 전송을 중시하는 프로토콜이다.
  4. FTP (File Transfer Protocol): 파일 전송을 위한 프로토콜이다.
  5. SMTP: 이메일 전송을 위한 프로토콜이다.

프로토콜 각기 다른 목적을 가지고 있습니다

  • CP/IP: 인터넷과 대부분의 네트워크에서 사용되는 프로토콜 스택이다.
  • HTTP/HTTPS: 웹 브라우징을 위한 프로토콜이다.
  • FTP: 파일 전송을 위한 프로토콜이다.
  • SMTP: 이메일 전송을 위한 프로토콜이다.
💡반드시 구분할 것 !!
소켓은 네트워크 통신을 위해 필요한 인터페이스를 제공하고 네트워크 프로토콜은 네트워크 상에서 데이터를 교환하는 규칙과 절차를 정의한 것

  • 소켓: 네트워크 통신을 위한 인터페이스로, IP 주소와 포트 번호로 구성됩니다. 소켓은 데이터를 송수신하기 위한 엔드포인트이다.
  • 프로토콜: 네트워크 상에서 데이터를 교환하는 규칙과 절차를 정의한다. 예를 들어, TCP/IP 프로토콜은 데이터의 전송과 오류 제어를 담당한다.
  1. TCP/IP 프로토콜
    • TCP/IP 프로토콜은 데이터의 전송을 담당한다. 이는 데이터를 작은 패킷으로 나누어 전송하고, 순서대로 재조립하며, 데이터의 신뢰성을 보장한다.
    • 클라이언트와 서버는 TCP/IP 프로토콜을 사용하여 데이터를 주고받는다.
  2. 프로토콜 계층
    • HTTP, FTP 등의 애플리케이션 계층 프로토콜은 데이터를 어떤 형식으로 주고받을지 정의한다.
    • 예를 들어, HTTP는 웹 페이지를 주고받는 규칙을 정의하고, FTP는 파일 전송을 위한 규칙을 정의한다.

통신 과정 - 클라이언트와 서버는 각각 소켓을 통해 연결을 설정하고, TCP/IP 프로토콜을 사용하여 데이터를 전송하며, 프로토콜 계층(예: HTTP 형식)을 통해 데이터를 해석하고 처리한다.

1 나만에 프로토콜을 만들어서 서버를 구성해보자. 프로토콜 적용 요약
  1. 메시지 형식: "COMMAND:DATA" 형식을 사용한다.
    • MSG:Hello 는 "Hello" 메시지를 전송한다.
    • BYE: 는 연결 종료를 의미한다.
  2. 클라이언트와 서버 간의 상호작용:
    • 클라이언트는 키보드 입력을 읽고 메시지를 서버에 전송한다.
    • 서버는 클라이언트로부터 메시지를 수신하여 모든 클라이언트에게 브로드캐스트한다.
    • 클라이언트가 "bye"를 입력하면 연결을 종료한다.
1 - 클라이언트 코드 수정
클라이언트 측 코드 먼저 수정하기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class MultiClient {

	public static void main(String[] args) {
		
		try {
			// 192.168.0.48
			Socket socket = new Socket("localhost", 5000);
			PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
			BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
			
			System.out.println(">>>> 서버에 접속 완료 <<<< ");
			
			// 실행에 흐름 - 약속 : 먼자 사용자 닉네임 보내기 
			System.out.println("Enter your name : ");
			String name = keyboard.readLine();
			out.println("NAME:" + name);  // 서버로 사용자 이름 전송 
			
			// 서버측으로 부터 온 데이터 읽기 
			Thread readThread = new Thread(() -> {
				try {
					String serverMsg;
					while( (serverMsg = in.readLine()) != null ) {
						System.out.println("server : " + serverMsg);	
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			});
			
			// 클라이언트가 서버로 데이터 보내기 
			Thread writeThread = new Thread(() -> {
				try {
					String userMessage;
					while( (userMessage = keyboard.readLine() ) != null ) {
						if(userMessage.equalsIgnoreCase("bye")) {
							out.println("BYE:");
						} else {
							out.println("MSG:" + userMessage);
						}
//						} else if(userMessage.equalsIgnoreCase("MSG")) {
//							out.println("MSG:" + userMessage);
//						}
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}); 
			
			// 스레드 시작
			readThread.start();
			writeThread.start();
			// 메인 스레드 대기 
			try {
				readThread.join();
				writeThread.join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			socket.close();
			System.out.println("서버로 부터 연결을 종료 하였습니다.");
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	} // end of main 
}

 

2 - 서버에 연결시 사용자 이름 방송 (본인 제외)
클라이언트 측 코드 먼저 수정하기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class MultiClient {

	public static void main(String[] args) {
		
		try {
			Socket socket = new Socket("localhost", 5000);
			PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
			BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
			
			System.out.println(">>>> 서버에 접속 완료 <<<< ");
			
			// 실행에 흐름 - 약속 : 먼자 사용자 닉네임 보내기 
			System.out.println("Enter your name : ");
			String name = keyboard.readLine();
			out.println("NAME:" + name);  // 서버로 사용자 이름 전송 
			
			// 서버측으로 부터 온 데이터 읽기 
			Thread readThread = new Thread(() -> {
				try {
					String serverMsg;
					while( (serverMsg = in.readLine()) != null ) {
						System.out.println("server : " + serverMsg);	
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			});
			
			// 클라이언트가 서버로 데이터 보내기 
			Thread writeThread = new Thread(() -> {
				try {
					String userMessage;
					while( (userMessage = keyboard.readLine() ) != null ) {
						if(userMessage.equalsIgnoreCase("bye")) {
							out.println("BYE:");
						} else if(userMessage.equalsIgnoreCase("MSG")) {
							out.println("MSG:" + userMessage);
						}
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}); 
			
			// 스레드 시작
			readThread.start();
			writeThread.start();
			// 메인 스레드 대기 
			try {
				readThread.join();
				writeThread.join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			socket.close();
			System.out.println("서버로 부터 연결을 종료 하였습니다.");
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	} // end of main 
}

'JAVA' 카테고리의 다른 글

JSON 파싱 연습  (0) 2024.06.07
(공부) 연결  (0) 2024.06.05
[JAVA] 1: N 소켓 양방향 통신  (1) 2024.05.24
[JAVA] 1:1 양방향 통신(채팅 기본 기능 구현)  (0) 2024.05.24
[JAVA] 1:1 양방향 통신  (0) 2024.05.24

관련글 더보기