광주인력개발원
크크오톡 팀프로젝트 - 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 소스코드를 읽어보고 내일 페어 프로그래밍 준비를 할 예정이다.