Programming/Java

TCP 소켓 통신

d-e-v-j 2024. 7. 30. 21:13
반응형

 

TCP 소켓 통신은 네트워크 프로그래밍에서 가장 기본적인 방법이다.

TCT)(Transmission Control Protocol) 는 신뢰성 있는 데이터 전송을 보장하는 전송 계층 프로토콜이다.

Socket은 네트워크 양쪽 간 통신을 담당하는 엔드포인트이다.

 

1. TCP 소켓 통신의 개념

두 개의 엔드포인트 간에 연결을 설정하여 데이터를 주고 받는다.

 

  • 연결 지향적: 통신을 시작하기 전에 연결을 설정해야 합니다.
  • 신뢰성 보장: 데이터의 순서 보장, 손실 시 재전송 등 신뢰성 있는 통신을 제공합니다.
  • 양방향 통신: 데이터 송수신이 동시에 가능합니다.

 

2.TCP 소켓 통신의 동작방식

 

  1. 소켓 생성: 서버와 클라이언트 모두 소켓을 생성합니다.
  2. 서버 바인딩 및 리스닝: 서버는 특정 IP 주소와 포트 번호에 소켓을 바인딩한 후, 클라이언트의 연결 요청을 기다립니다.
  3. 클라이언트 연결 요청: 클라이언트는 서버의 IP 주소와 포트 번호로 연결 요청을 보냅니다.
  4. 연결 수락: 서버는 클라이언트의 연결 요청을 수락하여 연결을 설정합니다.
  5. 데이터 송수신: 연결이 설정되면, 양쪽에서 데이터를 주고받을 수 있습니다.
  6. 연결 종료: 데이터 전송이 끝나면, 연결을 종료합니다.

 

3. 예시코드

  • Server
import java.io.*;
import java.net.*;

public class TCPServer {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(6666)) {
            System.out.println("Server is listening on port 6666");
            while (true) {
                Socket socket = serverSocket.accept();
                System.out.println("New client connected");

                InputStream input = socket.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(input));

                OutputStream output = socket.getOutputStream();
                PrintWriter writer = new PrintWriter(output, true);

                String text;
                while ((text = reader.readLine()) != null) {
                    System.out.println("Received: " + text);
                    writer.println("Echo: " + text);
                }

                socket.close();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

 

  • Client
import java.io.*;
import java.net.*;

public class TCPClient {
    public static void main(String[] args) {
        String hostname = "localhost";
        int port = 6666;

        try (Socket socket = new Socket(hostname, port)) {
            OutputStream output = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(output, true);

            InputStream input = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));

            BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
            String text;

            while ((text = consoleReader.readLine()) != null) {
                writer.println(text);
                String response = reader.readLine();
                System.out.println("Server: " + response);
            }

        } catch (UnknownHostException ex) {
            System.out.println("Server not found: " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("I/O error: " + ex.getMessage());
        }
    }
}

Server 와 Client 양쪽에 소켓을 열어 연결하는게 중요하며

Java code 이외에 방화벽 포트 허용 등이 이뤄지지 않으면 Connect time out error가 발생할 수 있다.


TCP 소켓 통신은 신뢰성 있는 데이터 전송을 보장한다는게 가장 큰 장점이고,

나는 요즘 결제 관련된 프로젝트를 진행하면 결제 기관끼리의 데이터 통신을 소켓통신으로 구현하고 있다.

 


 

 

 

728x90
반응형
LIST