Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 플로이드 와샬
- docker-compose
- 구현
- 도커
- 백트래킹
- 이분 매칭
- BFS
- 스프링 시큐리티
- 구간 트리
- 달팽이
- 서비스 디스커버리
- Gradle
- Logback
- spring boot
- 이분 탐색
- Spring Cloud Config
- Zuul
- 메모이제이션
- 유레카
- spring cloud
- 게이트웨이
- 스택
- 완전 탐색
- Java
- dp
- 다익스트라
- 트리
- 주울
- ZuulFilter
- 비트마스킹
Archives
- Today
- Total
Hello, Freakin world!
[채팅앱][클라이언트] 시작하기 - 서버와 연결하기 본문
클라이언트 부분부터 작성해보자.
클라이언트는 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 서버든 서버가 존재해야함을 느꼈다.
다음엔 이 클래스의 단위테스트를 작성하기 위해 채팅서버의 연결부분을 작성하도록 하자.
'Toy Project > 채팅 앱 만들기' 카테고리의 다른 글
[채팅앱][클라이언트] ClientChannelManager 단위 테스트 작성하기 (0) | 2020.02.26 |
---|---|
[채팅앱][클라이언트] IO 단위 테스트 어떻게 할 것인가? (0) | 2020.02.21 |
[채팅앱][서버] EventLoop 스레드 설계 (0) | 2020.02.21 |
[채팅앱][서버] non-blocking IO 다중 연결 서버 아키텍처 (0) | 2020.02.21 |
채팅 앱 초기 설계 (0) | 2020.01.17 |
Comments