본문 바로가기

Java_ 소켓

소켓 프로그래밍_ 기초

  • 소켓
    • 프로세스의 통신에 사용되는 양쪽 끝 단
    • 서로 다른 두 호스트를 연결해주는 도구로써 인터페이스의 역할
    • HTTP 통신과 다르게 양방향 통신, 실시간으로 데이터를 주고 받는 상황(게임, 채팅)등에 주로 사용
    • 종류
      • TCP
        • 연결 지향
        • 1:1 통신
        • 느린 전송 속도
        • 데이터 전송에 신뢰성 보장
      • UDP
        • 비연결 지향
        • 1:1, 1:n, n:n 통신
        • 빠른 전송 속도
        • 데이터 전송에 신뢰성 보장 못함

소켓의 통신 과정

 

  • Server.Java
public class Server {
    public static void main(String[] args) {
        Socket socket = null;       //Client 와 통신하기 위한 소켓
        ServerSocket serverSocket = null;       //서버 생성을 위한 서버소켓
        BufferedReader br = null;       //Client 로 부터 데이터를 읽어오기 위한 입력 스트림
        PrintWriter pw = null;      //Client 로 데이터를 보내기 위한 출력 스트림

        try {
            serverSocket = new ServerSocket(1234);
        }catch (IOException e) {
            System.out.println("해당 포트가 열려있습니다,");
        } try {
            System.out.println("서버 오픈");
            //서버를 생성, Client 접속 대기
            socket = serverSocket.accept();

            //입력 스트림 생성
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //출력 스트림 생성
            pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));

            String str = null;
            str = br.readLine();        //Client 로 부터 데이터 읽어옴
            System.out.println("Client의 메세지 : " + str);
            pw.write(str);
            pw.flush();     //버퍼링으로 인해 기록되지 않은 데이터를 출력스트림에 모두 출력
            socket.close();     //출력되지 않은 스트림 모두 출력하고 소켓 닫음
        } catch (IOException e) {

        }
    }
}

 

 

  • Client.Java
public class Client {
    public static void main(String[] args) {
        Socket socket = null;       //Server 와 통신하기 위한 소켓
        BufferedReader br = null;       //Server 로 부터 데이터를 읽어들이기 위한 입력 스트림
        BufferedReader br2 = null;      //키보드로부터 읽어들이기 위한 입력 스트림
        PrintWriter pw = null;      //Server 로 내보내기 위한 출력 스트림
        InetAddress ia = null;

        try {
            ia = InetAddress.getLocalHost();        //Server 로 접속하기 위한 로컬호스트 주소 가져옴
            socket = new Socket(ia, 1234);      //서버의 포트 번호
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            br2 = new BufferedReader(new InputStreamReader(System.in));

            pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));

            System.out.println(socket.toString());

        } catch (IOException e) {

        } try {
            System.out.print("서버로 보낼 메세지 : ");
            String data = br2.readLine();       //키보드로부터 입력
            pw.println(data);       //서버로 데이터 전송
            pw.flush();

            String str2 = br.readLine();        //서버로부터 되돌아오는 데이터 읽어옴
            System.out.print("서버의 응답 : " + str2);
            socket.close();
        } catch (IOException e) {

        }
    }
}

 

서버 실행 화면

 

클라이언트 실행 화면

 

  • InputStreamReader, BufferedReader
    • InputStream : Byte 단위로 데이터를 읽어옴 -> System.in 도 InputStream
    • InputStreamReader : Char 단위로 데이터를 읽어옴
    • BufferedReader : Char 단위의 직렬화
      • 코드
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  • socket의 데이터를 InputStream(바이트 단위)로 읽어오고 InputStreamReader를 통해 char 타입으로 변환 후 BufferedReader를 통해 직렬화

 

 

 

GitHub - Pearlmoon997/Socket: 자바 소켓 프로그래밍

자바 소켓 프로그래밍. Contribute to Pearlmoon997/Socket development by creating an account on GitHub.

github.com

 

'Java_ 소켓' 카테고리의 다른 글

Java_ 채팅, 스레드  (0) 2022.10.20
TCP & UDP  (0) 2022.10.06
소켓 프로그래밍  (0) 2022.09.29