[Java] 소켓 양방향 통신 구현

2023. 3. 4. 01:00·Java/Base
728x90
728x90

  - 서버와 클라이언트는 서로 키보드로 입력한 메세지를 주고 받을 수 있음

 

서버 측 코드

public class ServerTest {

    // 클라이언트를 연결받는 소켓
    ServerSocket serverSocket;

    // 실제 통신을 담당할 소켓
    Socket socket;

    // 키보드 담당 입력 스트림
    BufferedReader keyboardReader;

    // 소켓 담당 입력 스트림
    BufferedReader socketReader;

    // 소켓 담당 출력 스트림
    BufferedWriter socketWriter;

    public ServerTest() {
        initData();
    } 

    private void initData() {
        try {
            System.out.println("서버 실행");
            // 서버 소켓 생성
            serverSocket = new ServerSocket(10000); // 매개변수 : 포트 번호

            // 클라이언트 접속 대기 (접속 전까지는 여기서 멈춰 있음)
            socket = serverSocket.accept(); // 클라이언트가 접속하면 socket을 반환함
            // 점유하고 있지 않은 랜덤 포트 번호를 생성해서, 소켓 생성

            // 클라이언트가 연결되면 해당 텍스트 출력
            System.out.println("클라이언트 연결 완료");

            // 스트림 연결
            socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            socketWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            keyboardReader = new BufferedReader(new InputStreamReader(System.in));

            // while 문을 2개 구동해야 하므로, 하나는 내부 클래스 쓰레드로 구동
            new Thread(new KeyboardThread()).start();

            // 메인 쓰레드의 무한 루프 while 문은 가장 아래에 있어야 정상 작동함
            while (true) {
                // 클라이언트로부터 보내진 메세지를 읽음
                String clientMsg = socketReader.readLine();
                System.out.println("클라이언트 >>> " + clientMsg);
            }


        } catch (IOException e) {
            e.printStackTrace();

        } finally {
            try {
                keyboardReader.close();
                socketWriter.close();
                socketReader.close();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    } // end of initData

    // 키보드 입력을 받고 소켓으로 보내는 클래스
    class KeyboardThread implements Runnable {

        @Override
        public void run() {
            while (true) {
                try {
                    // 키보드 데이터 받아오기
                    String serverMsg = keyboardReader.readLine();

                    // 소켓으로 메세지 보내기
                    socketWriter.write(serverMsg + "\n");
                    socketWriter.flush();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            } // end of while
        }
    } // end of inner class

    public static void main(String[] args) {
        new ServerTest();
    }
} // end of outer class

 

클라이언트 측 코드

public class ClientTest {

    final String MY_IP = "localhost";
    final int PORT = 10000;

    // 실제 통신을 담당할 소켓
    Socket socket;

    // 키보드 담당 입력 스트림
    BufferedReader keyboardReader;

    // 소켓 담당 입력 스트림
    BufferedReader socketReader;

    // 소켓 담당 출력 스트림
    BufferedWriter socketWriter;

    public ClientTest() {
        initData();
    }

    private void initData() {
        System.out.println("클라이언트에서 서버 접속 요청");
        try {
            // 클라이언트와 서버 연결
            socket = new Socket(MY_IP, PORT); // 서버IP주소, 서버포트주소

            // 서버에 연결되면 해당 텍스트 출력
            System.out.println("서버에 연결 완료")

            // 스트림 연결
            keyboardReader = new BufferedReader(new InputStreamReader(System.in));
            socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            socketWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

            // while 문을 2개 구동해야 하므로, 하나는 내부 클래스 쓰레드로 구동
            new Thread(new KeyboardThread()).start();

            while (true) {
                // 서버로부터 보내진 메세지를 읽음
                String serverMsg = socketReader.readLine();
                System.out.println("서버 >>> " + serverMsg);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                keyboardReader.close();
                socketWriter.close();
                socketReader.close();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    } // end of initData

    class KeyboardThread implements Runnable {

        @Override
        public void run() {
            try {
                // 키보드 데이터 받아오기
                String clientMsg = keyboardReader.readLine();

                // 소켓으로 메세지 보내기
                socketWriter.write(clientMsg + "\n");
                socketWriter.flush();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    } // end of inner class

    public static void main(String[] args) {
        new ClientTest();
    }
} // end of outer class

 

320x100
반응형
저작자표시 비영리 변경금지 (새창열림)

'Java > Base' 카테고리의 다른 글

[Java] Java로 SQL CRUD 구현하기  (0) 2023.03.09
[Java] Java와 MySQL 데이터베이스 연결하기  (0) 2023.03.09
[Java] 소켓 통신  (0) 2023.03.03
[Java] 입출력 스트림 (I/O Stream)  (1) 2023.03.03
[Java] 입출력 스트림 - 예제 모음  (0) 2023.03.03
'Java/Base' 카테고리의 다른 글
  • [Java] Java로 SQL CRUD 구현하기
  • [Java] Java와 MySQL 데이터베이스 연결하기
  • [Java] 소켓 통신
  • [Java] 입출력 스트림 (I/O Stream)
스응
스응
    반응형
    250x250
  • 스응
    이서영의 개발 블로그
    스응
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (384)
      • Java (134)
        • Base (54)
        • Spring Boot (37)
        • JSP (16)
        • Swing (GUI) (20)
        • Design Pattern (7)
      • C# (13)
      • PHP (18)
      • SQL (27)
      • Vue.js (9)
      • Tailwind CSS (4)
      • TypeScript (7)
      • HTML & CSS (27)
      • JavaScript (26)
      • jQuery (10)
      • Android (3)
      • - - - - - - - - - - - - - - (0)
      • Hotkeys (5)
      • CS (30)
      • etc. (13)
      • Error Note (16)
      • Team Project (24)
        • Airlines Web Project (12)
        • University Web Project (6)
        • Strikers 1945 GUI Project (6)
      • My Project (18)
        • Library Web Project (8)
        • Pet Shopping Mall GUI Project (10)
  • 블로그 메뉴

    • Home
    • Write
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    java
    Codeigniter
    jsp
    Wordpress
    errorNote
    http
    vuejs
    개발일지
    typeScript
    티스토리챌린지
    오블완
    git
    js
    php
    Hotkeys
    jQuery
    zapier
    HTML
    C#
    Swing
    면접
    SWAGGER
    SQL
    CSS
    SpringBoot
    cs
    Android
    SEO
    tailwindcss
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
스응
[Java] 소켓 양방향 통신 구현
상단으로

티스토리툴바