광주인력개발원

크크오톡 팀프로젝트 - 3일차 - 개발일지 [2023-07-13 학습일지]

플광 2023. 7. 30. 12:10

 

 

오늘 한 일

프로토타입 기능 첫 구현

그동안 구현을 못하느라, 멀리 branch 되어왔던 서버파트 파일과 기능을 합치고 정리함

Qsignal 구현

헤더 방식, 헤더 이름, DTO 타입 정리

메시지 클래스 추가 정리

 

소감

산 넘어 산이 많아 생각보다 진도를 많이 못나간 느낌이다. 그래도 큰 산들은 많이 넘긴 것 같다. 내일은 본격적으로 구현을 해야한다.

리소스를 최대한 투입하여 성과를 올려볼 예정이다.


 

 
서버 런처 기능 구현함, 마지막 불러오는 시간은 로그 파일 마지막줄 파싱을 하여 읽어들이는 방식
import datetime
import os
import time
from threading import Thread

from PyQt5 import QtCore, QtGui, QtWidgets

from Code.domain.class_user import User
from Code.network.class_worker_thread import WorkerServerThread
from Code.network.server_ui.ui_server_controller_widget import Ui_server_controller


class ServerControllerWidget(QtWidgets.QWidget, Ui_server_controller):
    ENCODED_DOT = bytes('.', 'utf-8')
    ENCODED_PASS = bytes('pass', 'utf-8')
    LOG_PATH = """C:\\Users\\KDT107\\Desktop\\KKOTalk\\log.txt"""
    SERVER_STATUS_PATH = """C:\\Users\\KDT107\\Desktop\\KKOTalk\\server_status.txt"""

    @staticmethod
    def save_server_log():
        os.system("""C:\\Users\\KDT107\\Desktop\\KKOTalk\\Code\\network\\server_logger.bat""")

    @staticmethod
    def check_netstat_via_cmd():
        os.system("""C:\\Users\\KDT107\\Desktop\\KKOTalk\\Code\\network\\check_server_on.bat""")

    def __init__(self, server_obj, db_connector):
        super().__init__()
        self.setupUi(self)
        self.server = server_obj
        self.db_conn = db_connector
        self.server_status_check_timer = None
        self.server_running_timer = None
        self.server_running_second = 0
        self.server_start_time = None
        self.set_initial_label()
        self.set_btn_trigger()
        self.check_netstat_via_cmd()
        self.set_timer_to_check_server_status()
        self.set_timer_to_server_running_timer()
        self.get_last_time_server_and_set_label()

    def set_timer_to_check_server_status(self):
        if self.server_status_check_timer is None:
            self.server_status_check_timer = QtCore.QTimer(self)
            self.server_status_check_timer.setInterval(1000)
            self.server_status_check_timer.timeout.connect(lambda: self.assert_server_status())
            self.server_status_check_timer.start()
        else:
            self.server_status_check_timer.stop()
            self.server_status_check_timer.start()

    def set_timer_to_server_running_timer(self):
        if self.server_running_timer is None:
            self.server_running_timer = QtCore.QTimer(self)
            self.server_running_timer.setInterval(1000)
            self.server_running_timer.timeout.connect(lambda: self.count_running_time())

    def count_running_time(self):
        self.server_start_time: datetime.datetime
        run_time = datetime.datetime.now() - self.server_start_time
        s = run_time.seconds
        hours, remainder = divmod(s, 3600)
        minutes, seconds = divmod(remainder, 60)
        self.label_run_time.setText(f"{hours:02}:{minutes:02}:{seconds:02}")

    def get_last_time_server_and_set_label(self):
        last_line = None
        try:
            with open(self.LOG_PATH, 'r', encoding="utf-8") as file:
                whole_log = file.read().split('\n')
                line_count = len(whole_log)
                for i in range(line_count - 1, -1, -1):
                    print(i, whole_log[i])
                    if len(whole_log[i]) > 3:
                        last_line = whole_log[i]
                        break
            if last_line is not None:
                temp_list = last_line.split(' ')
                last_date_time = ' '.join(temp_list[:2])
                self.label_last_stop.setText(last_date_time)
            else:
                self.label_last_stop.setText("-")
        except:
            self.label_last_stop.setText("-")

    def is_server_listening(self):
        try:
            with open(self.SERVER_STATUS_PATH, "w", encoding="utf-8") as file:
                file.write('')
            self.check_netstat_via_cmd()
            with open(self.SERVER_STATUS_PATH, "r", encoding="utf-8") as file:
                if "LISTENING" in file.read().split("\n")[0]:
                    return True
        except:
            return False

    def is_server_running(self):
        result = self.is_server_listening()
        if result:  # 서버가 켜저있는 경우
            return True
        else:
            return False

    def assert_server_status(self):
        self.check_netstat_via_cmd()
        if self.is_server_running() is True:
            self.label_server_status.setText("🟢 가동중")
        else:
            self.label_server_status.setText("🔴 종료됨")
        # self.label_server_status.setText("🟠 시작중")

    def set_initial_label(self):
        # todo check serve status logic
        self.label_server_status.setText("🔴 종료됨")
        self.label_start_time.setText("-")
        self.label_run_time.setText("00:00:00")

    def set_btn_trigger(self):
        self.btn_run.clicked.connect(lambda state: self.server_run())
        self.btn_stop.clicked.connect(lambda state: self.server_stop())

Qt시그널을 처음으로 사용해보았다. 잘 사용하면 fancy한 기능들을 많이 쓸 수 있을 것 같다.

 

# in class_client_prototype.py
class ClientPrototypeWidget(QtWidgets.QWidget, Ui_prototype):
    # signal 클래스 변수
    assert_same_id_siganl = pyqtSignal(bool)
# in class_client.py
    def send_join_id_and_pw_for_join_access(self, join_username, join_pw, join_nickname):
        join_user = User(None, join_username, join_pw, join_nickname)
        user_json_str = join_user.toJSON()
        self.client_socket.send(self.HEADER_LIST[self.join_user])
        self.client_socket.recv(self.BUFFER)  # "." 받음
        self.client_socket.send(user_json_str.encode())
    def receive_message(self):
        while True:
            print('시작')
            # self.return_result = self.client_socket.recv(self.BUFFER).decode(self.FORMAT)
            return_result = self.client_socket.recv(self.BUFFER).decode(self.FORMAT)
            response_header = return_result[:self.HEADER_LENGTH].strip()
            response_data = return_result[self.HEADER_LENGTH:].strip()
            if response_header == self.assert_username:
                if response_data == 'pass':
                    self.client_widget.assert_same_id_siganl.emit(True)
                elif response_data == '.':
                    self.client_widget.assert_same_id_siganl.emit(False)

오늘 밤에는 UI 소스코드를 읽어보고 내일 페어 프로그래밍 준비를 할 예정이다.