관리 메뉴

CASSIE'S BLOG

[슈퍼코딩] 59-1강 Server-client 소개와 직렬화/역직렬화 본문

PROGRAMMING/슈퍼코딩 강의 정리

[슈퍼코딩] 59-1강 Server-client 소개와 직렬화/역직렬화

ITSCASSIE1107 2023. 12. 16. 16:08
반응형

네트워크와 컴퓨터가 연결 될 때 반드시 소켓을 이용한다.

 

 

 

 

플러그 꽂는 게 소켓이라는 느낌이다.

 

 

 

 

 

client 코드는 다른 컴퓨터로 하기

 

 

 

 

 

 

 

Server도 그렇고 Client도 그렇고 실행메소드로 만들면 된다고함.

 

 

클라이언트소켓만들고 서버소켓도 만들어야한다.

package exercise.chapter_57;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public static void main(String[] args) {
        // TODO: 서버 소켓 생성
        // TODO: 클라이언트 접속 대기
        try(ServerSocket serverSocket = new ServerSocket(1234); // 서버 소켓 생성
            Socket clientSocket = serverSocket.accept(); // 클라이언트 접속 대기
        ){
            System.out.println("서버가 시작되었습니다.");
            System.out.println("클라이언트가 접속하였습니다.");

            // TODO: 클라이언트로부터 데이터를 받기 위한 InputStream 생성
            InputStream clientInputstream = clientSocket.getInputStream();
            BufferedReader clientBufferedReader = new BufferedReader(new InputStreamReader(clientInputstream));

            // TODO: 클라이언트로 데이터를 보내기 위한 OutputStream 생성
            OutputStream serverOutputStream = clientSocket.getOutputStream();
            PrintWriter printWriter = new PrintWriter(serverOutputStream, true);

            // inputLine;
            String inputLine;

            // TODO: 클라이언트로부터 데이터를 읽고 화면에 출력
            while((inputLine = clientBufferedReader.readLine()) != null ) {
                System.out.println("클라이언트로 부터 온 요청은 " + inputLine);

                printWriter.println("서버로부터 응답이 왔습니다.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }






    }
}

 

지금 try문 안에 넣었잖아

ServerSocket은 컴퓨터의 공유리소스임. 그래서 나중에 close를 해야함.

공유리소스가 autoClosable이라는 인터페이스를 상속하고있으면 
try안에 적어주게되면 나중에 close를 호출할 필요가 없다

 

예외가 생길 것 같은거는 전부다 try catch 문 적어준다. 그게 정석임. 

 

 

기존의 스트림은 바이트스트림인데
문자열로 왔다갔다할거기때문에
InputStreamReader(clientInputstream)를 넣어주라고함. (이거 보조)
근데 속도를 빠르게 하기 위해서
ButterReader에 넣는다고 함 (보조)

 


In Java, there are two main types of streams: byte streams (InputStream, OutputStream) and character streams (Reader, Writer). The byte streams deal with raw binary data, while character streams are designed for handling character data (strings).

In your code, the clientInputstream is an InputStream, which is a byte stream. However, when you want to read text data from the client, it's more convenient to use character streams. This is where InputStreamReader comes in. It's a bridge from byte streams to character streams, converting bytes into characters.

Here's a breakdown of the relevant part of your code:

 

 

// TODO: 클라이언트로부터 데이터를 받기 위한 InputStream 생성
InputStream clientInputstream = clientSocket.getInputStream();

// Wrap the InputStream in an InputStreamReader to convert bytes to characters
BufferedReader clientBufferedReader = new BufferedReader(new InputStreamReader(clientInputstream));

 

Explanation:

  1. clientSocket.getInputStream(): This gets the raw byte stream from the client. It's like a pipe through which bytes flow from the client to your server.
  2. new InputStreamReader(clientInputstream): This wraps the byte stream in a character stream. It converts the incoming bytes into characters using the default character encoding of the platform.
  3. new BufferedReader(...): This adds buffering to the character stream. Buffering is like having a temporary storage area for characters. It can improve performance by reducing the number of actual reads from the underlying byte stream.

So, putting it all together, you're creating a BufferedReader named clientBufferedReader that reads text data from the client. This makes it easier to work with text-based communication between your server and client. You can use methods like readLine() on clientBufferedReader to read complete lines of text from the client.

 

서버는 클라이언트한테 request받고 그 request를 해석해서
적당한 응답을 내줘야하잖아.
내보내기 위해서 outputStream 만들어줘야지

 

클라이언트 입장에서의 output socket를 만들면 된다.
OutputStream serverOutputStream = clientSocket.getOutputStream();

 


소켓이 리턴됨
The line ClientSocket clientSocket = serverSocket.accept(); in your code is waiting for a client to connect to your server. Once a connection is established, the accept() method returns a new Socket object (clientSocket) that represents the communication link between the server and the connected client.

소켓에서 outputStream 연결되는거임.
Let me break this down:

clientSocket.getOutputStream(): This method gets the output stream associated with the clientSocket. An output stream is a stream through which data can be sent from the server to the connected client.

OutputStream serverOutputStream = ...: The obtained output stream is then assigned to the variable serverOutputStream. This variable can be used in the server code to write data that will be sent to the connected client.

 

 

나가는거는 속도보다 사용성 중시
보조스트림 PrintWriter를 쓰는데 거기에
serverOutputStream 넣어주면 보조스트림 기능들을 잘 쓸 수 있다.

 

true 기능 넣어주면 flush라는 기능을 쓸 수 있다고함. 

 

while문 안에 bufferedReder로 읽고 readLine으로 한줄씩 읽고
원래 다 읽으면 null을 내보내서 null될때까지 읽으면 되는걸로 while문 써줌

 

readLine 컨트롤 따라가보면
Returns: 에 null if the end of the stream has been reached without reading any characters.

반응형