JAVA/Coding

[JAVA] 자바 소켓(Socket)통신 이란? 코드 구현

Huiyeon 2023. 9. 1. 17:52

 

https://huiyeon.tistory.com/48

 

[JAVA] 자바 소켓(Socket)통신 이란? 개념 정리

소켓(Socket)이란? 소켓은 프로토콜, ip주소, 포트넘버로 정의가 된다. TCP/UDP 두 가지 방식으로 분류 된다. TCP는 연결형 프로토콜이고, UDP에 비해 속도는 느리지만 신뢰성 있는 데이터 송수신을 보

huiyeon.tistory.com

저번 개념 정리에 이어서 코드 구현에 대해 작성해 보았습니다.

 


TCP와 UDP

  • TCP와 UDP는 전송 계층에서 사용되는 프로토콜로, TCP는 신뢰성 있는 데이터 전송을 보장하고 연결 지향적이며, UDP는 비연결성이고 신뢰성이 낮지만 빠른 데이터 전송을 지원합니다.
  • Java에서는 TCP와 UDP를 모두 지원하며, 소켓(Socket)을 통해 이러한 프로토콜을 사용할 수 있습니다.


URL 클래스와 URLConnection 클래스

  • URL 클래스는 웹 주소(Uniform Resource Locator)를 추상화한 클래스로, 웹 페이지나 웹 서버에 접근할 때 주로 사용됩니다.
  • URLConnection 클래스는 URL을 통해 원격 자원에 접근하기 위한 정보를 제공하며, HTTP 연결과 관련된 정보를 얻거나 설정할 수 있습니다.


소켓(Socket) 프로그래밍

  • 소켓 프로그래밍은 네트워크 통신을 위한 핵심 개념 중 하나입니다.
  • Java에서는 소켓을 사용하여 클라이언트-서버 애플리케이션을 구축할 수 있습니다.
  • Socket과 ServerSocket 클래스를 사용하여 TCP 기반의 통신을 구현할 수 있으며, DatagramSocket 클래스를 사용하여 UDP 기반의 통신을 구현할 수도 있습니다.
  • 또한, 네트워크 프로그래밍에서는 예외 처리가 중요합니다. 다양한 예외 상황에 대비하여 try-catch 블록을 활용하여 예외 처리를 해주어야 합니다.

 

EchoServer.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer {
    private BufferedReader bufferR;
    private BufferedWriter bufferW;
    private InputStream is;
    private OutputStream os;
    private ServerSocket serverS;
    public EchoServer(int port){
        try{
            serverS = new ServerSocket(port);
        }catch(IOException ioe){
            ioe.printStackTrace();
            System.exit(0);
        }while(true){
            try{
                System.out.println("클라이언트의 요청을 기다리는 중");
                Socket tcpSocket = serverS.accept();
                System.out.println("클라이언트의 IP 주소: "+ tcpSocket.getInetAddress().getHostAddress());
                is = tcpSocket.getInputStream();
                os = tcpSocket.getOutputStream();
                bufferR = new BufferedReader(new InputStreamReader(is));
                bufferW = new BufferedWriter(new OutputStreamWriter(os));
                String message = bufferR.readLine();
                System.out.println("수신메세지 : "+message);
                message += System.getProperty("line.separator");
                bufferW.write(message);
                bufferW.flush();
                bufferR.close();
                bufferW.close();
                tcpSocket.close();
            } catch(IOException ioe){
                ioe.printStackTrace();
            }
        }

    }
    public static void main(String[] args) {
        new EchoServer(1234);
    }
    
}

- 이 코드는 간단한 에코(Echo) 서버를 구현한 Java 프로그램입니다. 에코 서버는 클라이언트가 보낸 메시지를 그대로 돌려주는 역할을 합니다. 이 코드에서는 TCP/IP 프로토콜을 사용하여 클라이언트와 서버 간의 통신을 처리합니다.


클래스 및 필드 선언

  • EchoServer 클래스는 서버의 주요 로직을 포함합니다.
  • bufferR과 bufferW는 클라이언트와 통신할 때 사용되는 입출력 버퍼를 나타냅니다.
  • is와 os는 입력 스트림과 출력 스트림을 나타냅니다.
  • serverS는 서버 소켓을 나타냅니다.


생성자

  • 생성자 EchoServer(int port)는 포트 번호를 매개변수로 받아 서버 소켓을 생성합니다.
  • 클라이언트의 연결 요청을 기다리며, 연결 요청이 들어오면 클라이언트와 통신하는 코드를 무한 루프로 실행합니다.

 

서버 소켓 생성

  • serverS = new ServerSocket(port); 코드로 서버 소켓을 생성합니다.
  • 지정된 포트 번호(port)에서 클라이언트의 연결 요청을 대기합니다.

 

클라이언트 연결 대기

  • serverS.accept(); 메서드로 클라이언트의 연결 요청을 기다립니다.
  • 클라이언트가 연결 요청하면 이 메서드는 클라이언트와 통신할 소켓 객체인 tcpSocket을 반환합니다.


클라이언트와 통신

  • tcpSocket을 통해 클라이언트와 입출력 스트림을 생성합니다.
  • 클라이언트가 보낸 메시지를 bufferR을 사용하여 읽고, 이를 서버에서 그대로 다시 클라이언트로 보내기 위해 bufferW를 사용합니다.
  • 읽은 메시지는 message 변수에 저장되고, 이를 다시 보내기 위해 개행 문자를 추가한 후 bufferW를 통해 클라이언트에게 전송합니다.
  • 마지막으로 입출력 스트림과 소켓을 닫습니다.

 

 

EchoClient.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class EchoClient {
    private String ip;
    private int port;
    private String str;
    BufferedReader file;
    public EchoClient(String ip, int port) throws IOException {
        this.ip = ip;
        this.port = port;
        Socket tcpSocket = getSocket();
        OutputStream os_socket = tcpSocket.getOutputStream();
        InputStream is_socket = tcpSocket.getInputStream();

        BufferedReader bufferR = new BufferedReader(new InputStreamReader((is_socket)));
        BufferedWriter bufferW = new BufferedWriter(new OutputStreamWriter(os_socket));
        System.out.println("입력 : ");
        file = new BufferedReader(new InputStreamReader(System.in));
        str = file.readLine();
        str += System.getProperty("line.separator");
        bufferW.write(str);
        bufferW.flush();
        str = bufferR.readLine();
        System.out.println("Echo Reault : " + str);
        file.close();
        bufferW.close();
        bufferR.close();
        tcpSocket.close();
    }
    public Socket getSocket() {
        Socket tcpSocket = null;
        try {
            tcpSocket = new Socket(ip, port);
        }catch (IOException ioe) {
            ioe.printStackTrace();
            System.exit(0);
        }
        return tcpSocket;
    }

    public static void main(String[] args) throws IOException {
        new EchoClient("localhost", 1234);
    }
    
}

- 이 코드는 Java를 사용하여 간단한 에코(Echo) 클라이언트를 구현한 프로그램입니다. 에코 클라이언트는 서버로 문자열을 보내고, 서버가 그 문자열을 그대로 다시 보내는 간단한 통신 프로그램입니다.

 


클래스 및 필드 선언

  • EchoClient 클래스는 클라이언트의 주요 로직을 포함합니다.
  • ip와 port는 서버에 연결할 때 사용할 IP 주소와 포트 번호를 저장합니다.
  • str은 사용자가 입력한 문자열을 저장합니다.
  • file은 사용자로부터 키보드 입력을 받기 위한 BufferedReader 객체입니다.

 

생성자

  • 생성자 EchoClient(String ip, int port)는 서버의 IP 주소와 포트 번호를 매개변수로 받아 클라이언트를 초기화합니다.
  • getSocket() 메서드를 호출하여 서버에 소켓 연결을 시도하고, 연결된 소켓 객체를 얻어옵니다.
  • 클라이언트와 서버 간의 통신을 위한 입력 스트림(is_socket)과 출력 스트림(os_socket)을 얻습니다.

 

사용자 입력 받기

  • 사용자에게 입력 메시지를 출력하고, 키보드로부터 문자열을 입력받아 str 변수에 저장합니다.
  • 이 때 System.getProperty("line.separator")를 추가하여 개행 문자를 포함한 문자열로 변환합니다.

 

서버로 메시지 전송

  • 클라이언트에서 서버로 메시지를 전송하기 위해 출력 스트림(bufferW)을 사용합니다.
  • str에 저장된 메시지를 bufferW를 통해 서버로 전송하고, 버퍼를 비웁니다.

 

서버로부터 에코된 메시지 수신

  • 서버로부터의 응답을 받기 위해 입력 스트림(bufferR)을 사용합니다.
  • bufferR을 통해 서버로부터 에코된 메시지를 읽어들이고, 그 값을 str 변수에 저장합니다.

 

자원해제

  • 사용이 끝난 자원들을 닫습니다. file, bufferW, bufferR, 그리고 소켓(tcpSocket)을 순서대로 닫습니다.

 

getSocket 메서드

  • getSocket 메서드는 서버에 소켓 연결을 시도하고, 연결된 소켓 객체를 반환합니다.
  • 서버 IP 주소와 포트 번호를 사용하여 소켓을 생성합니다.

 

감사합니다 - !

반응형