본문 바로가기

Language/Java

[Java] Socket 통신 간단 예제

반응형

Intro

안녕하세요. 플리체입니다.

이번에는 Java Socket을 이용한 Client(클라이언트, 사용자)와 Server(서버) 간의 간단한 통신 예제를 소개시켜 드리겠습니다.

 

  • 클라이언트는 서버에 연결 요청을 보내고, 서버는 클라이언트의 연결 요청을 수신합니다.
  • 그 후, 서버와 클라이언트는 소켓을 통해 데이터를 교환할 수 있습니다.

단일 통신(1회)

  • Server
public class Server {
    public static void main(String[] args) {
        try {
            // 서버 소켓 생성 및 포트 지정
            ServerSocket serverSocket = new ServerSocket(9999);

            // 클라이언트의 연결 요청 대기
            Socket socket = serverSocket.accept();

            // 소켓으로부터 입력 스트림 생성
            InputStream in = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));

            // 클라이언트로부터 데이터 수신
            String message = reader.readLine();
            System.out.println("클라이언트로부터 수신한 데이터: " + message);

            // 소켓 종료
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

  • Client
public class Client {
    public static void main(String[] args) {
        try {
            // 서버의 IP 주소와 포트 지정
            InetAddress serverAddr = InetAddress.getByName("localhost");
            int port = 9999;

            // 서버에 연결
            Socket socket = new Socket(serverAddr, port);

            // 소켓으로부터 출력 스트림 생성
            OutputStream out = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(out);

            // 서버로 데이터 전송
            String message = "Hello, Server!";
            writer.println(message);
            writer.flush();
            System.out.println("서버로 전송한 데이터: " + message);

            // 소켓 종료
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

다회 통신

  • Server
public class Server {
    public static void main(String[] args) {
        try {
            // 서버 소켓 생성 및 포트 지정
            ServerSocket serverSocket = new ServerSocket(9999);
            System.out.println("서버가 시작되었습니다.");

            while (true) {
                // 클라이언트의 연결 요청 대기
                Socket socket = serverSocket.accept();
                System.out.println("클라이언트와 연결되었습니다.");

                // 소켓으로부터 입력 스트림 생성
                InputStream in = socket.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));

                // 소켓으로부터 출력 스트림 생성
                OutputStream out = socket.getOutputStream();
                PrintWriter writer = new PrintWriter(out);

                // 클라이언트로부터 데이터 수신 및 전송
                String message = null;
                while ((message = reader.readLine()) != null) {
                    System.out.println("클라이언트로부터 수신한 데이터: " + message);

                    writer.println("서버에서 보낸 응답 데이터: " + message);
                    writer.flush();
                    System.out.println("클라이언트로 전송한 데이터: " + message);
                }

                // 소켓 종료
                socket.close();
                System.out.println("클라이언트와 연결이 종료되었습니다.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

  • Client
public class Client {
    public static void main(String[] args) {
        try {
            // 서버의 IP 주소와 포트 지정
            InetAddress serverAddr = InetAddress.getByName("localhost");
            int port = 9999;

            // 서버에 연결
            Socket socket = new Socket(serverAddr, port);
            System.out.println("서버와 연결되었습니다.");

            // 소켓으로부터 입력 스트림 생성
            InputStream in = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));

            // 소켓으로부터 출력 스트림 생성
            OutputStream out = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(out);

            // 데이터 송수신
            String message = "Hello, Server!";
            while (true) {
                // 서버로 데이터 전송
                writer.println(message);
                writer.flush();
                System.out.println("서버로 전송한 데이터: " + message);

                // 서버로부터 데이터 수신
                String response = reader.readLine();
                System.out.println("서버로부터 수신한 데이터: " + response);

                // 일정 시간 대기
                Thread.sleep(1000);
            }

            // 소켓 종료
            // socket.close();
            // System.out.println("서버와 연결이 종료되었습니다.");
        } catch (IOException e) {
        	e.printStackTrace();
        }

 

주의점

  1. 서버와 클라이언트의 IP 주소와 포트 번호가 일치해야 합니다.
    • 클라이언트에서 서버에 접속할 때 사용하는 IP 주소와 포트 번호는 서버에서 사용하는 것과 일치해야 합니다.
  2. 클라이언트와 서버의 소켓 생성 순서가 일치해야 합니다.
    • 클라이언트와 서버의 소켓 생성 순서가 일치하지 않으면 소켓 연결이 실패할 수 있습니다.
  3. 소켓 연결 종료 시 클라이언트와 서버 양측에서 모두 소켓을 닫아주어야 합니다.
    • 소켓 연결이 끊어지면 소켓이 자원으로서 해제되므로, 소켓을 닫지 않으면 메모리 누수 등의 문제가 발생할 수 있습니다.
  4. 소켓 통신에서는 예외 처리가 매우 중요합니다.
    • 소켓 통신에서는 네트워크 상황에 따라 예기치 않은 예외가 발생할 수 있기 때문에, 예외 처리를 철저히 해주어야 합니다.
반응형