소소한개발팁
Published 2023. 4. 29. 11:31
TCP와 UDP 컴퓨터 과학/네트워크
반응형

TCP와 UDP는 인터넷 프로토콜 중에서 가장 많이 사용되는 프로토콜입니다. 이 두 가지 프로토콜은 모두 데이터를 전송하는 방식이지만, 목적이나 특징이 다릅니다.

TCP(Transmission Control Protocol)는 연결 지향적인 프로토콜입니다. 데이터를 보내기 전에 연결을 맺고, 데이터를 보내고 나서는 연결을 끊습니다. 이렇게 연결을 맺고 끊음으로써 신뢰성 있는 데이터 전송을 보장합니다. TCP는 데이터를 전송할 때, 순서를 유지하고, 손상되지 않도록 확인하는 기능도 있어서 데이터의 신뢰성이 높습니다. 하지만, 이러한 신뢰성을 보장하기 위해서는 데이터의 전송 속도가 느립니다.

UDP(User Datagram Protocol)는 비연결성 프로토콜입니다. 연결을 맺지 않고 데이터를 전송하기 때문에, TCP에 비해 전송 속도가 빠릅니다. 하지만, 신뢰성이 떨어지기 때문에 데이터 전송 과정에서 일부 데이터가 손상되거나 유실될 수 있습니다. 그래서 UDP는 실시간 데이터 전송이 필요한 경우, 예를 들어 동영상 스트리밍이나 온라인 게임 등에서 사용됩니다.

즉, TCP는 데이터의 신뢰성을 중요시하는 경우에 사용되고, UDP는 전송 속도를 중요시하는 경우에 사용됩니다.

 

 

TCP Server 생성 

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

public class TCPServer {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(8080);
            Socket clientSocket = serverSocket.accept();
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                out.println(inputLine);
            }
            clientSocket.close();
            serverSocket.close();
        } catch (IOException e) {
            System.out.println("Exception caught when trying to listen on port or listening for a connection");
            System.out.println(e.getMessage());
        }
    }
}

 

ServerSocket 클래스를 사용하여 서버 소켓을 생성하고, accept() 메소드를 사용하여 클라이언트의 연결 요청을 받습니다. 그 후, PrintWriter 클래스를 사용하여 클라이언트에게 데이터를 보내고, BufferedReader 클래스를 사용하여 클라이언트로부터 데이터를 받습니다.

 

TCP Client 생성

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

public class TCPClient {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 8080);
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
            String userInput;
            while ((userInput = stdIn.readLine()) != null) {
                out.println(userInput);
                System.out.println("echo: " + in.readLine());
            }
            socket.close();
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host localhost");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to localhost");
            System.exit(1);
        }
    }
}

 

Socket 클래스를 사용하여 서버에 연결하고, PrintWriter 클래스를 사용하여 서버로 데이터를 보내고, BufferedReader 클래스를 사용하여 서버로부터 데이터를 받습니다.

 

UDP Server 생성

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPServer {
    public static void main(String[] args) throws IOException {
        DatagramSocket serverSocket = new DatagramSocket(8080);
        byte[] receiveData = new byte[1024];
        byte[] sendData = new byte[1024];

        while (true) {
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            serverSocket.receive(receivePacket);
            String sentence = new String(receivePacket.getData());
            InetAddress IPAddress = receivePacket.getAddress();
            int port = receivePacket.getPort();
            String capitalizedSentence = sentence.toUpperCase();
            sendData = capitalizedSentence.getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
            serverSocket.send(sendPacket);
        }
    }
}

 

DatagramSocket 개체를 생성하여 지정된 포트에서 UDP 패킷을 수신하고 수신 패킷을 무한정 수신합니다. 패킷이 도착하면 바이트 배열로 읽히고 문자열로 변환됩니다. 그런 다음 문자열이 대문자로 변환되고 새 DatagramPacket 개체를 생성하여 클라이언트의 IP 주소 및 포트 번호로 다시 전송하여 클라이언트로 다시 전송됩니다.

 

 

UDP Client 생성

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

public class UDPClient {
    public static void main(String[] args) throws IOException {
        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
        DatagramSocket clientSocket = new DatagramSocket();
        InetAddress IPAddress = InetAddress.getByName("localhost");
        byte[] sendData = new byte[1024];
        byte[] receiveData = new byte[1024];
        String sentence = inFromUser.readLine();
        sendData = sentence.getBytes();
        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 8080);
        clientSocket.send(sendPacket);
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        clientSocket.receive(receivePacket);
        String modifiedSentence = new String(receivePacket.getData());
        System.out.println("FROM SERVER:" + modifiedSentence);
        clientSocket.close();
    }
}

 

DatagramSocket 개체를 만들고 새 DatagramPacket 개체를 만들어 서버의 IP 주소와 포트 번호로 전송하여 서버에 메시지를 보냅니다. 그런 다음 응답을 수신할 새 DatagramPacket 개체를 만들어 서버로부터 응답을 수신하기 위해 대기한 다음 응답을 콘솔에 인쇄합니다. 마지막으로 소켓을 닫습니다.

 

 

반응형
profile

소소한개발팁

@개발자 뱅

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!