[Java] Socket Communication

아 이거 이해하겠다고 대가리 깨지는 줄 알았다 시발

그만큼 힘들었으니 야무지게 적어보겠다.

 

Socket

-  Socket 클래스는 client에서 서버로 접속하거나 Server에서 accept 하는데 필요한 클래스이다.

- 소켓을 활용하여 7계층에서 4계층까지의 작업을 단순화 할 수 있다.

- 소켓을 통해 서버와 클라이언트가 통신이 가능하다.

- 소켓을 통해 통신을 체결하고 이후 스트림을 통해 서버와 클라이언트가 데이터를 주고 받는다.

 

ServerSocket

java에서 서버 프로그램을 개발할 때 쓰이는 클래스이다.

 

Stream // import java.io.* 의 주요 클래스

  바이트 기반 스트림  문자 기반 스트림
입력 스트림 출력 스트림 입력 스트림 출력 스트림
최상위 클래스 InputStream OutputStream Reader Writer
하위 클래스 FileInputStream  FileOutputStream InputStreamReader  OutputStreamWriter
  DataInputStream DataOutputStream BufferedReader BufferedWriter  

- 바이트단위 입출력 스트림 : 그림, 멀티미디어, 문자 등 모든 종류의 데이터들을 주고받을 수 있다.

- 문자단위 입출력 스트림 : 오로지 문자만 주고받을 수 있게 특화되어 있다.

 

하위 클래스 세부 설명

FileInputStream / FileOutputStream 다른 입력 클래스들과 연결해서 바이트 단위로 데이터를 읽어오는 클래스
DataInputStream / DataOutputStream 자바의 기본 데이터 타입에 해당하는 데이터를 바이트 단위로 파일에 쓰기 위한 클래스
InputStreamReader / OutputStreamWriter 문자 단위 입출력을 위한 하위 스트림 클래스
BufferedReader / BufferedWriter   Input&OutputStreamReader 에 버퍼링 기능이 추가된 클래스

 

 


Server

package day06;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
// 양방향 1회통신 , 클라이언트가 먼처 입력 후 서버가 후 입력
public class ServerChatMain {
    public static void main(String[] args) {
        try { // Socket 클래스를 사용시 try - catch를 해주어야함

            // ServerSocket 클래스를 통해 serverSocket을 생성한다.
            // 1. 지정한 포트와 소켓을 바인딩 해주고 포트를 LISTEN 상태로 변경해준다.
            ServerSocket serverSocket = new ServerSocket(9999);

            // 3. 서버는 클라이언트의 접속을 수신한다.
            // 클라이언트의 접속을 승인히고 접속되면 접속된 클라이언트의 IP주소를 출력
            Socket clientSocket = serverSocket.accept();
            System.out.println(clientSocket.getInetAddress()+"와 접속되었습니다.");

            // 5. 서버가 클라이언트에게 데이터를 받아오기 위한 과정
            // 5-1. 서버도 클라이언트가 보낸 데이터를 수신하는 스트림을 개설한다.
            // 입력받는 코드
            InputStream is = clientSocket.getInputStream(); // byte(바이트) 단위 입출력을 위한 최상위 스트림 클래스
            InputStreamReader isr = new InputStreamReader(is); // 문자 단위 입출력을 위한 하위 스트림 클래스
            BufferedReader br = new BufferedReader(isr); // 동일한 보조 스트림이지만 
            						 // InputStreamReader에 버퍼링 기능이 추가된 클래스
            String data = br.readLine(); // 버퍼에 저장된 문장단위로 읽어서 저장하고
            System.out.println(data); // 저장한 문자를 출력한다.
            // 입력받는 코드 끝

            // 보내는 코드
            OutputStream os = clientSocket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bow = new BufferedWriter(osw);
            Scanner scanner = new Scanner(System.in);
            String text = scanner.nextLine();

            bow.write(text+"\n");
            bow.flush();
            // 보내는 코드 끝

        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}

 

 

 

 

Client

package day06;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class ClientChatMain {
    public static void main(String[] args) {

        try { // Socket 클래스를 사용시 try - catch를 해주어야함
            
            // 서버로 접속하는 코드
            // 2. 서버로 접속하기 위한 소켓을 생성하여 접속을 시도한다.
            // 이때 서버에서 개방한 포트의 정보를 입력한다. Ip주소와 port 번호가 해당됨
            Socket clientSocket = new Socket("192.168.0.213", 9999);

            // 4. 클라이언트가 서버에게 데이터를 보내기위한 과정
            // 4-1. 클라이언트가 서버에게 데이터를 송신하는 스트림을 개설한다.
            // 보내는 코드
            OutputStream os = clientSocket.getOutputStream(); // byte(바이트) 단위 입출력을 위한 최상위 스트림 클래스
            OutputStreamWriter osw = new OutputStreamWriter(os); // 문자 단위 입출력을 위한 하위 스트림 클래스
            BufferedWriter bow = new BufferedWriter(osw); // 동일한 보조 스트림이지만 
            						 // OutputStreamReader에 버퍼링 기능이 추가된 클래스
                                     
            Scanner scanner = new Scanner(System.in); // 보낼 문자를 입력받는다
            String text = scanner.nextLine();  // 보낼 문자를 입력받는다

            bow.write(text+"\n"); // 버퍼에 입력한 문자를 저장하고 끝을 알려주어야 정상적으로 출력 가능하다.
            bow.flush(); // 다시 버퍼를 초기화 해준다.
            // 보내는 코드 끝

            // 입력받는 코드
            InputStream is = clientSocket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String data = br.readLine();
            System.out.println(data);
            // 입력받는 코드 끝

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

 

 

참고

https://velog.io/@duck-ach/23.-%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%8A%A4%ED%8A%B8%EB%A6%BC-InputStream-OutputStream-JAVA

'Java' 카테고리의 다른 글

[Java] JSP (Intellij + Tomcat) 실습  (2) 2023.12.02
[Java] JDBC  (0) 2023.11.30
[Java] 추상클래스 vs 인터페이스  (2) 2023.11.29
[Java]Non-Access Modifier(final,static,abstract)  (0) 2023.11.29
[Java] 인터페이스 (Interface)  (2) 2023.11.29