Hello, Freakin world!

[채팅앱][클라이언트] 시작하기 - 서버와 연결하기 본문

Toy Project/채팅 앱 만들기

[채팅앱][클라이언트] 시작하기 - 서버와 연결하기

johnna_endure 2020. 2. 21. 17:04

클라이언트 부분부터 작성해보자.


클라이언트는 main 메서드를 이용해 시작된다.
다음과 같은 코드가 있다.

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {
    static Logger logger = Logger.getLogger(Main.class.getCanonicalName());
    public static void main(String[] args) throws IOException {
        System.out.println("채팅앱 시작");

        System.out.println("서버와 연결 시도 중.");
        /*
        서버와 연결 코드
         */
        System.out.println("서버와 연결 완료");
    }
}

주석처리 된 부분에 서버와의 연결을 시도하는 코드를 작성하면 된다.

채널을 생성하고 관리하는 클래스를 하나 만들자.
ClientChannelManager 클래스는 다음의 기능을 가진다.

  • 하나의 channel 객체를 유지한다.
  • 연결, 예외처리를 담당하는 메서드를 가진다.

import ...

public class ClientChannelManager {
    private SocketChannel socketChannel;
    private Logger logger = Logger.getLogger(ClientChannelManager.class.getCanonicalName());
    private SocketAddress serverAddress;

    public ClientChannelManager(SocketAddress serverAddress){
        this.serverAddress = serverAddress;
    }

    public SocketChannel getConnectedChannelInstance(){
        if(socketChannel == null) {
            initializeChannel();
            boolean isConnected = connectServer(serverAddress);
            if (isConnected) {
                return socketChannel;
            } else {
                return null;
            }
        }
        //채널이 한번 close된 경우
        if(!socketChannel.isConnected()) {
            boolean isConnected = connectServer(serverAddress);
            if (isConnected) {
                return socketChannel;
            } else {
                return null;
            }
        }
    }

    private void initializeChannel() {
        try {
            socketChannel = SocketChannel.open();
            socketChannel.configureBlocking(false);
        } catch (IOException e) {
            logger.info("채널 초기화 실패 : " + e.getMessage());
        }
    }

    private boolean connectServer(SocketAddress address){
        try {
            socketChannel.connect(address);
            return socketChannel.finishConnect();
        } catch (IOException e) {
            logger.info("서버와 connect 실패 : " + e.getMessage());
        }
        return false;
    }
}

서버와의 연결을 담당하는 Manager 클래스다.
getConnectedChannel 메서드에 대한 단위 테스트를 작성하려고 했지만, 여러 시도 끝에 IO 작업에 대한 단위테스트는 결국 외부에 진짜 서버든 mock 서버든 서버가 존재해야함을 느꼈다.


다음엔 이 클래스의 단위테스트를 작성하기 위해 채팅서버의 연결부분을 작성하도록 하자.

Comments