이번 포스트는 채팅 프로그램의 핵심을 알기 위해 Java, Android, C 의 채팅 프로그램에 대해서 조사한 바를 정리하는 겸 해서 작성했다.
본래의 목표는 Java, Android, C 모두를 실제로 구현해보고 눈으로 확인한 다음 코드들의 핵심을 파악하는 것이 목표였으나 Android와 C는 코드만 구하고 실제로 돌려보지는 않았다. 다만 코드를 확인하고 읽는데는 문제가 없었으므로 핵심을 파악하는데는 틀리지 않았다고 생각한다.
여기서 다룰 주제는 다음과 같다.
1. Chatting Program in Java
2. Chatting Program in Android
3. Chatting Program in C
4. 채팅 프로그램들의 공통점
1. Chatting Program in Java
Java 채팅 프로그램의 Source Code는 ‘자바의 정석’ TCP 프로그래밍의 한 예제에서 가져왔다. 예제 프로그램은 크게 두 서버측 프로그램과 클라이언트측 프로그램으로 나누어져 있다.
먼저 서버측 프로그램을 살펴보자.
서버측 프로그램에서는 ServerSocket 를 이용하는데 이 녀석은 교환기 같은 역할을 한다. 우선 자신이 차지할 Port를 설정해서 만들게 되면 클라이언트가 접속해 주기를 기다린다.
ServerSocket serverSocket = new ServerSocket(Port);
그러다가 클라이언트의 ‘요청’이 생기게 되면 socketAccept() 메서드를 이용해 서버 Socket과 클라이언트 Socket을 연결시킨다.
Socket socket = serverSocket.accept();
그래서 ServerSocket이 마치 교환기 같은 역할을 한다는 것이다. 왜냐하면 자신의 port에 누군가(Client측 Socket)로부터 전화가 오면 그 전화를 받을 사람(Server측 Socket)과 연결시키는 역할을 하기 때문이다.
본 예제는 다중 채팅을 지원하기 위해서 Thread를 이용했다. Thread를 이용하는 방법에 대해서는 여기서 다룰 만한 주제가 아니니 생략한다. 다만 Thread가 무슨 일을 하는지 파악하는 것이 중요하다.
Thread는 Client가 접속을 할 때마다 생성된다. 그리고 쓰레드 내부에 전화기 역할을 하는 DataInputStream과 DataOutputStream을 만들어서 클라이언트와 통신을 하게 된다.
DataInputStream in = new DataInputStream(socket.getInputStream());
DataInputStream out = new DataOutputStream(socket.getOutputStream());
여기서 inputStream은 전화기에서 상대편 음성이 들려오는 수신부 역할을 하게 되고, outputStream은 내가 말하는 발신부 역할을 하게 된다.
2. Chatting Program in Android
Android 상에서 채팅 프로그램을 구현하기 위해 다음의 사이트에서 소스를 가져왔다.
여기서는 서버와 클라이언트를 각각 컴퓨터와 핸드폰으로 두었다. 컴퓨터를 서버로 돌리고 핸드폰을 클라이언트로 둬서 서로 통신을 할 수 있도록 하는 프로그램이다.
하지만 코드를 빌드하는데 문제가 생겨 아직까지 실제로 프로그램을 실행해보지는 못했다. 그래서 눈으로 코드를 보고 분석하는데 그쳤다. 분석한 결과는 다음과 같다.
Android도 결국 Java 랭기지를 사용하기 때문인지 자바의 그것과 아주 흡사했다. 또한 TCP Socket 채팅 프로그램의 틀에서 그렇게 많이 벗어나지 않는다는 것을 발견했다.
서버측부터 살펴보면 서버측은 Java의 그것과 거의 똑같은 수준이다. 어차피 서버는 컴퓨터에 존재하는데다 서버가 하는 일은 동일하기 때문이다. Java에서와 마찬가지로 ServerSocket은 PORT 하나를 독점하고 클라이언트의 요청을 기다리다가 요청이 들어오면 Accept를 해서 서버와 클라이언트간의 통신을 연결시켜준다.
클라이언트인 Application 내에서는 주소값과 포트를 이용해서 서버로의 접속을 시도한다. 연결이 완료되면 ObjectInputStream, ObjectOutputStream을 사용해서 서버의 소켓와 데이터를 주고 받는다. ObjectStream을 사용한다는게 조금 특이하기는 하지만 중요한 것은 결국 통신을 하는데는 InputStream, OutputStream을 사용하고 있다는 점이었다.
3. Chatting Program in C on Linux
C언어는 OS에 따라 가져오는 API가 다르기 때문에 Mac을 이용해서 Socket 프로그래밍을 하기 위해서 다음의 사이트를 참고했다.
연결을 기다릴때는 listen()함수를 사용하고 요청을 받아들일 때는 accept()를 사용한다. 또한 데이터를 주고 받는데는 read(), write()함수를 사용한다.
위의 함수사용법만 제외하면 다시 Socket 프로그래밍에 대해서 이야기하기가 민망할 정도로 Java 에서의 소켓 프로그래밍와 유사했다. 그러므로 이 부분에 대한 자세한 이야기는 생략하고 핵심적인 이야기를 하기 위해 다음 목차로 넘어가도록 한다.
4. 채팅 프로그램들의 공통점
Java, Android, C 모두 Socket을 이용해서 채팅 프로그램을 만들고 있음을 알 수 있었다. 여기서 모든 공통된 흐름이 있었는데, 정리하자면 다음과 같다.
-서버측
- 자신의 IP주소값과 임의의 PORT 값을 이용해서 서버측 소켓을 만든다.
- 클라이언트로부터 요청이 들어오기를 기다린다.
- 요청이 들어오면 Accept 한다.
- 클라이언트와 데이터를 주고 받는다.
-클라이언트측
- 접속하고자 하는 서버의 IP주소와 Port를 이용해 소켓을 생성하고 접속한다.
- 서버와 데이터를 주고 받는다.
여기서는 Java 소스 코드만을 압축하여 올려둡니다. Android나 C 코드가 궁금하신 분은 제가 올려둔 링크를 참조하시거나 구글에서 검색을 하시면 금방 찾으실 수 있을 겁니다.
Java 소스코드가 필요하신 분은 아래의 링크를 클릭하여 다운 받으세요.
댓글 없음:
댓글 쓰기