[NP] Hash Tag Communication

mlnls·2024년 7월 17일

NP_Project

목록 보기
4/4
post-thumbnail

0. 요약

본 프로젝트는 해시태그 기능이 포함된 채팅 서버와 클라이언트를 구현하는 것을 목표로 합니다. 사용자는 특정 해시태그를 팔로우하고, 해당 해시태그가 포함된 메시지만 수신할 수 있습니다. 이를 통해 대규모 채팅 환경에서 사용자의 관심사에 맞는 메시지만을 효율적으로 전달할 수 있습니다.

  • 서론: 해시태그 기능의 필요성과 배경, 구현된 시스템의 주요 특징 및 장점에 대해 설명합니다. 해시태그 기능을 통해 사용자는 원하는 주제의 메시지만을 선택적으로 수신할 수 있으며, 이를 통해 정보 과부하를 줄이고 관심 있는 정보에 집중할 수 있습니다.

  • 프로젝트 설명: 시스템의 구조와 각 모듈의 기능을 상세히 설명합니다. 서버는 클라이언트의 연결을 관리하고 해시태그 기반의 메시지 필터링을 수행하며, 클라이언트는 서버와의 통신을 통해 해시태그를 관리하고 메시지를 주고받습니다. 주요 함수의 실행 흐름도 설명하여 구현의 이해를 돕습니다.

  • 결과 분석: 시스템의 실행 방법과 결과를 분석합니다. 클라이언트는 해시태그를 추가하거나 확인할 수 있으며, 일반 채팅 모드에서 해시태그가 포함된 메시지를 전송하면 해당 해시태그를 팔로우하는 클라이언트들에게만 메시지가 전달됩니다. 성능 지표와 자원 소모량도 평가하여 시스템의 효율성을 검증합니다.

1. 서론

최근 SNS와 메신저 서비스에서 해시태그를 통한 관심사 기반의 콘텐츠 필터링이 중요한 기능으로 자리잡고 있습니다. 해시태그를 통해 사용자는 원하는 주제만을 선택적으로 받아볼 수 있어, 정보의 과부하를 줄이고 필요한 정보만을 효율적으로 얻을 수 있습니다. 따라서 본 프로젝트는 이러한 해시태그 기능을 채팅 서버에 도입하여 사용자 경험을 향상시키고자 합니다.

  • 해시태그 기반 필터링: 사용자는 특정 해시태그를 팔로우하고, 해당 해시태그가 포함된 메시지만을 수신합니다. 이를 통해 불필요한 정보를 걸러내고, 관심 있는 주제에만 집중할 수 있습니다.

  • 실시간 메시지 전송: 실시간으로 메시지를 주고받을 수 있어, 사용자의 반응을 즉시 확인할 수 있습니다. 이는 특히 빠른 피드백이 필요한 상황에서 유용합니다.

  • 다중 클라이언트 지원: 다수의 클라이언트를 동시에 지원하여, 대규모 채팅 환경에서도 원활하게 동작합니다. 이는 대규모 이벤트나 커뮤니티에서 유용하게 사용할 수 있습니다.

  • 유연한 해시태그 관리: 사용자는 해시태그를 자유롭게 추가하고 확인할 수 있어, 필요에 따라 관심사를 쉽게 변경할 수 있습니다.

2. 배경지식

  • 개발환경: C 언어, POSIX 스레드, 소켓 프로그래밍
  • 사용된 프로토콜: TCP/IP
  • 라이브러리: pthread, socket

3. 프로젝트 설명

  1. 서버와 다수의 클라이언트가 TCP/IP를 통해 연결됩니다.
  2. 각 클라이언트는 특정 해시태그를 추가하거나 확인할 수 있으며, 일반 채팅 모드로 전환할 수 있습니다.
  3. 클라이언트가 해시태그가 포함된 메시지를 전송하면, 해당 해시태그를 팔로우하는 클라이언트들에게만 메시지가 전달됩니다.
  • 서버 모듈:
    • 클라이언트 연결 관리
    • 해시태그 기반 메시지 필터링 및 전송

  • 클라이언트 모듈:
    • 서버와의 연결 및 통신
    • 해시태그 관리 (추가/확인)
    • 메시지 송수신

서버 모듈

void * handle_clnt(void * arg) {
    // 클라이언트 소켓을 받아 메시지를 수신하고 처리
    while ((str_len = read(clnt_sock, msg, sizeof(msg) - 1)) != 0) {
        // 메시지 처리
        if (tag_start) {
            // 해시태그 메시지 전송
            send_msg(formatted_msg, strlen(formatted_msg), clnt_sock, tag);
        } else {
            // 일반 메시지 전송
            send_msg(formatted_msg, strlen(formatted_msg), clnt_sock, "");
        }
    }
}

void send_msg(char * msg, int len, int sender_sock, char * tag) {
    // 모든 클라이언트에게 메시지 전송
    for (i = 0; i < clnt_cnt; i++) {
        if (clients[i].sock != sender_sock) {
            write(clients[i].sock, msg, len);
        }
    }
}

클라이언트 모듈

void * send_msg(void * arg) {
    // 사용자 입력을 받아 서버에 메시지 전송
    while (1) {
        fgets(msg, BUF_SIZE, stdin);
        write(sock, msg, strlen(msg));
    }
}

void * recv_msg(void * arg) {
    // 서버로부터 메시지를 받아 출력
    while (1) {
        str_len = read(sock, name_msg, NAME_SIZE + BUF_SIZE - 1);
        fputs(name_msg, stdout);
    }
}
  • 복잡도: 메시지 필터링 및 전송 과정에서 O(n)의 시간복잡도를 가집니다. 여기서 n은 연결된 클라이언트의 수입니다.

  • 지연시간: TCP/IP 프로토콜을 사용하여 실시간 메시지 전송이 가능하지만, 클라이언트 수가 많아질수록 지연시간이 증가할 수 있습니다.

  • 자원소모량: 다중 스레드 환경에서 각 클라이언트마다 스레드를 할당하여 자원소모가 발생합니다.

4. 결과분석

  1. 클라이언트가 연결되면 해시태그 확인, 해시태그 추가를 선택할 수 있습니다.
  2. 해시태그 추가 시, 클라이언트는 관심 있는 해시태그를 추가할 수 있습니다.
  3. 일반 채팅 모드에서 해시태그를 포함한 메시지를 입력하면 해당 해시태그를 팔로우하는 클라이언트에게만 메시지가 전달됩니다.

그림 1. 서버 연결

그림 2. 클라이언트 연결

  1. 서버 실행

    ./hash_serv 8080 명령어로 서버를 실행합니다.

    서버는 클라이언트의 접속을 기다리며, 클라이언트가 접속하면 해당 클라이언트의 접속 메시지를 출력합니다.

  2. 클라이언트 실행

    ./hash_clnt 127.0.0.1 8080 client1, ./hash_clnt 127.0.0.1 8080 client2, ./hash_clnt 127.0.0.1 8080 client3

    명령어로 각 클라이언트를 실행합니다.클라이언트는 서버에 접속하며, 접속 시 클라이언트의 이름을 서버에 등록합니다.

  • 해시태그를 설정하는 메뉴들입니다.

  • 1번을 누르면 현재 클라이언트의 해시태그를 확인할 수 있습니다.
  • 2번을 누르면 현재 클라이언트에서 해시태그를 추가할 수 있습니다.

업로드중..그림 5. 실제 예시 1번

  • 실제로 해시태그를 걸지 않은 상대에게는 채팅이 가지 않는 모습을 보여줍니다. 하지만 위와 같이 서버에서는 모두 파악해야 하기에 해시태그를 먼저 띄운 뒤 채팅을 확인합니다.

업로드중..그림 6. 실제 예시 2번

  1. 해시태그 추가:

    클라이언트 1은 해시태그 #공부를 추가합니다.

    클라이언트 2는 해시태그 #공부를 추가합니다.

    클라이언트 3은 해시태그를 추가하지 않습니다.

  2. 메시지 송수신:

    클라이언트 1이 해시태그 #공부를 포함한 메시지 "안녕하세요"를 보냅니다.

    클라이언트 2는 해당 해시태그를 구독 중이므로 메시지를 수신합니다.

    클라이언트 3은 해당 해시태그를 구독하지 않으므로 메시지를 수신하지 않습니다.

  3. 일반 메시지 송수신:

    클라이언트 1이 일반 메시지 "안녕하세요"를 보냅니다.

    모든 클라이언트가 메시지를 수신합니다.


5. 한계점 및 개선 가능성

한계점

  • 클라이언트 수가 많아질수록 서버의 부하가 증가하여 성능 저하가 발생할 수 있습니다.
  • 해시태그 기능이 단순하여, 더 복잡한 조건 필터링에는 한계가 있습니다.

향후 발전 가능성

  • 서버의 부하를 줄이기 위해 멀티프로세스 또는 비동기 I/O를 활용한 아키텍처로 개선할 수 있습니다.
  • 해시태그 기능을 고도화하여, 논리 연산을 통한 복잡한 필터링 기능을 추가할 수 있습니다.
  • GUI를 도입하여 사용자 친화적인 인터페이스를 제공할 수 있습니다.
  • 실제 사이트처럼 운용하여 Axios 등 백엔드에서 데이터를 저장하고 관리할 수 있습니다.

6. 결론

본 프로젝트는 해시태그 기능이 포함된 채팅 서버를 구현하여, 사용자가 관심 있는 주제에 대해서만 메시지를 수신할 수 있도록 했습니다. 이를 통해 대규모 채팅 환경에서 정보 과부하를 줄이고, 효율적인 메시지 전달을 가능하게 했습니다. 향후 성능 개선 및 기능 확장을 통해 더 나은 사용자 경험을 제공할 수 있을 것입니다.

profile
@mlnl_s

0개의 댓글