본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

JAVA

TCP와 UDP, 데이터의 신뢰성이 중요한가 신속성이 중요한가?

 

TCP Transmission Control Protocol

UDP User Datagram Protocol

네트워크 통신을 위한 두 가지 주요한 프로토콜

데이터의 정확성과 신뢰성이 중요한 경우에는 TCP를 사용하고, 신속한 전송이 중요한 경우에는 UDP를 사용할 수 있다.

 

 

TCP Transmission Control Protocol

가상 회선 방식

연결 지향적이고 신뢰성 있는 프로토콜

데이터 전송의 순서가 보장되며, 데이터의 손실이나 손상을 최소화하기 위해 재전송과 오류 검출 및 복구 기능을 제공한다.

세그먼트라는 단위로 데이터를 나누어 전송하고, 수신 측에서는 이를 재조립하여 원본 데이터를 복원한다.

TCP는 HTTP, FTP, SMTP 등과 같이 데이터의 정확성과 순서가 중요한 응용 프로그램에 주로 사용

 

간단한 에코 시스템 코드예시

서버는 9800 포트에서 실행되며, 클라이언트는 로컬호스트(localhost)의 9800 포트로 연결합니다.

import java.io.*;
import java.net.*;

public class TCPServer {
    public static void main(String[] args) {
        try {
            // 서버 소켓 생성 및 포트 9800에 바인딩
            ServerSocket serverSocket = new ServerSocket(9800);
            System.out.println("TCP Server started. Waiting for client...");

            // 클라이언트의 연결을 대기하고, 연결이 되면 클라이언트 소켓 생성
            Socket clientSocket = serverSocket.accept();
            System.out.println("Client connected.");

            // 클라이언트로부터 데이터를 받을 BufferedReader 생성
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            // 클라이언트에게 데이터를 보낼 PrintWriter 생성
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

            // 클라이언트로부터 메시지를 받고, 에코하여 다시 클라이언트에게 보냄
            String message;
            while ((message = in.readLine()) != null) {
                System.out.println("Client: " + message);
                out.println("Server Echo: " + message);
            }

            // 스트림과 소켓 닫기
            in.close();
            out.close();
            clientSocket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
import java.io.*;
import java.net.*;

public class TCPClient {
    public static void main(String[] args) {
        try {
            // 서버에 연결하기 위한 소켓 생성
            Socket socket = new Socket("localhost", 9800);
            System.out.println("Connected to TCP Server.");

            // 서버와 통신할 BufferedReader 및 PrintWriter 생성
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

            // 사용자로부터 메시지 입력을 받을 BufferedReader 생성
            BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
            String message;
            while (true) {
                // 사용자로부터 메시지 입력 받음
                System.out.print("Enter message to server: ");
                message = userInput.readLine();
                // 서버에 메시지 전송
                out.println(message);
                // 서버로부터 받은 에코 메시지 출력
                System.out.println("Server Echo: " + in.readLine());
            }

            // 스트림과 소켓 닫기
            // in.close();
            // out.close();
            // userInput.close();
            // socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



 

 

UDP User Datagram Protocol

데이터그램 방식

비연결 지향적이며 신뢰성이 낮은 프로토콜

독립적으로 처리되므로 패킷 손실이 발생할 경우 다음 패킷이 영향을 받지 않는다.

데이터 전송의 순서가 보장되지 않으며, 오류 검출만을 제공하고, 복구 기능은 제공하지 않는다.

UDP는 실시간 응용 프로그램이나 스트리밍 서비스( 온라인 게임, 동영상 스트리밍 )에서 사용되며, 데이터의 신속한 전송이 중요한 경우에 유용하다.

 

간단한 에코 시스템 코드예시

서버는 9800 포트에서 실행되며, 클라이언트는 로컬호스트(localhost)의 9800 포트로 연결합니다.

import java.io.*;
import java.net.*;

public class UDPServer {
    public static void main(String[] args) {
        try {
            // UDP 서버 소켓 생성 및 포트 9800에 바인딩
            DatagramSocket serverSocket = new DatagramSocket(9800);
            System.out.println("UDP Server started. Waiting for client...");

            byte[] receiveData = new byte[1024];
            byte[] sendData = new byte[1024];

            while (true) {
                // 클라이언트로부터 데이터를 받기 위한 DatagramPacket 생성 및 수신 대기
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                serverSocket.receive(receivePacket);

                // 수신된 데이터를 문자열로 변환하여 출력
                String message = new String(receivePacket.getData(), 0, receivePacket.getLength());
                System.out.println("Client: " + message);

                // 클라이언트의 주소와 포트를 얻어와서 에코 메시지 생성
                InetAddress clientAddress = receivePacket.getAddress();
                int clientPort = receivePacket.getPort();
                String replyMessage = "Server Echo: " + message;
                sendData = replyMessage.getBytes();

                // 에코 메시지를 클라이언트에게 전송
                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientPort);
                serverSocket.send(sendPacket);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
import java.io.*;
import java.net.*;

public class UDPClient {
    public static void main(String[] args) {
        try {
            // UDP 클라이언트 소켓 생성
            DatagramSocket clientSocket = new DatagramSocket();
            InetAddress serverAddress = InetAddress.getByName("localhost"); // 서버의 주소
            int serverPort = 9800; // 서버의 포트 번호

            // 사용자 입력을 받기 위한 BufferedReader 생성
            BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
            byte[] sendData;
            byte[] receiveData = new byte[1024];

            while (true) {
                // 사용자로부터 메시지 입력 받기
                System.out.print("Enter message to server: ");
                String message = userInput.readLine();
                sendData = message.getBytes();

                // 서버에 데이터 전송
                DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, serverPort);
                clientSocket.send(sendPacket);

                // 서버로부터 에코된 메시지 수신
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                clientSocket.receive(receivePacket);

                // 수신된 에코 메시지 출력
                String replyMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
                System.out.println("Server Echo: " + replyMessage);
            }

            // clientSocket.close();
            // userInput.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}