From e7304247c78f4f85fc4848d5393aea45670eda63 Mon Sep 17 00:00:00 2001 From: misyaguziya <53165965+misyaguziya@users.noreply.github.com> Date: Sun, 18 May 2025 15:20:27 +0900 Subject: [PATCH] [Update] WebSocket configuration: Change host to 127.0.0.1 and port to 2231; refactor WebSocket server initialization and message handling --- src-python/config.py | 6 +- src-python/controller.py | 8 +- src-python/model.py | 116 ++++++++++++------ .../models/websocket/websocket_server.py | 2 +- 4 files changed, 88 insertions(+), 44 deletions(-) diff --git a/src-python/config.py b/src-python/config.py index 7910400b..16f3802f 100644 --- a/src-python/config.py +++ b/src-python/config.py @@ -965,6 +965,7 @@ class Config: self.saveConfig(inspect.currentframe().f_code.co_name, value) @property + @json_serializable('WEBSOCKET_HOST') def WEBSOCKET_HOST(self): return self._WEBSOCKET_HOST @@ -975,6 +976,7 @@ class Config: self.saveConfig(inspect.currentframe().f_code.co_name, value) @property + @json_serializable('WEBSOCKET_PORT') def WEBSOCKET_PORT(self): return self._WEBSOCKET_PORT @@ -1171,8 +1173,8 @@ class Config: self._VRC_MIC_MUTE_SYNC = False self._NOTIFICATION_VRC_SFX = True self._WEBSOCKET_SERVER = True - self._WEBSOCKET_HOST = "0.0.0.0" - self._WEBSOCKET_PORT = 8765 + self._WEBSOCKET_HOST = "127.0.0.1" + self._WEBSOCKET_PORT = 2231 def load_config(self): if os_path.isfile(self.PATH_CONFIG) is not False: diff --git a/src-python/controller.py b/src-python/controller.py index 398e3e37..0c3c4dca 100644 --- a/src-python/controller.py +++ b/src-python/controller.py @@ -298,7 +298,7 @@ class Controller: if config.WEBSOCKET_SERVER is True: model.websocketSendMessage( { - "type":"SEND", + "type":"SENT", "message":message, "translation":translation, "transliteration":transliteration @@ -466,11 +466,11 @@ class Controller: } ) - # update textbox message log (Sent) + # update textbox message log (Chat) if config.LOGGER_FEATURE is True: if len(translation) > 0: translation_text = " (" + "/".join(translation) + ")" - model.logger.info(f"[SENT] {message}{translation_text}") + model.logger.info(f"[CHAT] {message}{translation_text}") return {"status":200, "result":{ @@ -1840,8 +1840,8 @@ class Controller: @staticmethod def setEnableWebSocketServer(*args, **kwargs) -> dict: - config.WEBSOCKET_SERVER = True model.startWebSocketServer() + config.WEBSOCKET_SERVER = True return {"status":200, "result":config.WEBSOCKET_SERVER} @staticmethod diff --git a/src-python/model.py b/src-python/model.py index d848fd94..7d39294e 100644 --- a/src-python/model.py +++ b/src-python/model.py @@ -1,5 +1,7 @@ import copy import gc +import asyncio +import json from subprocess import Popen from os import makedirs as os_makedirs from os import path as os_path @@ -100,43 +102,10 @@ class Model: self.kks = kakasi() self.watchdog = Watchdog(config.WATCHDOG_TIMEOUT, config.WATCHDOG_INTERVAL) self.osc_handler = OSCHandler(config.OSC_IP_ADDRESS, config.OSC_PORT) - - # WebSocketサーバーの初期化 - self.websocket_server = WebSocketServer( - host=config.WEBSOCKET_HOST, - port=config.WEBSOCKET_PORT - ) - - def startWebSocketServer(self): - try: - self.websocket_server.start() - except Exception: - errorLogging() - - def stopWebSocketServer(self): - if self.websocket_server: - try: - self.websocket_server.stop() - except Exception: - errorLogging() - - def checkWebSocketServer(self): - if self.websocket_server: - try: - return self.websocket_server.is_running - except Exception: - errorLogging() - return False - - def websocketSendMessage(self, message): - """ - WebSocketサーバーから全クライアントにメッセージを送信する - :param message: 送信するメッセージ - """ - try: - self.websocket_server.send(str(message)) - except Exception: - errorLogging() + self.websocket_server = None + self.websocket_server_loop = False + self.websocket_server_alive = False + self.th_websocket_server = None def checkTranslatorCTranslate2ModelWeight(self, weight_type:str): return checkCTranslate2Weight(config.PATH_LOCAL, weight_type) @@ -865,4 +834,77 @@ class Model: self.th_watchdog.join() self.th_watchdog = None + def startWebSocketServer(self): + """WebSocketサーバーを起動し、別スレッドで実行する""" + self.websocket_server_loop = True + self.websocket_server_alive = False # 初期状態を明示 + + async def WebSocketServerMain(): + try: + self.websocket_server = WebSocketServer( + host=config.WEBSOCKET_HOST, + port=config.WEBSOCKET_PORT, + ) + self.websocket_server.start() + self.websocket_server_alive = True + + # イベントループが終了するまで待機 + while self.websocket_server_loop: + self.websocket_server.send("Server is running...") + await asyncio.sleep(0.5) # 応答性向上のため間隔短縮 + + except Exception: + errorLogging() + # 具体的なエラー内容をログに残す場合 + # self.logger.error(f"WebSocket server error: {str(e)}") + finally: + # 確実にサーバーを停止 + if hasattr(self, 'websocket_server') and self.websocket_server: + self.websocket_server.stop() + self.websocket_server_alive = False + + self.th_websocket_server = Thread(target=lambda: asyncio.run(WebSocketServerMain())) + self.th_websocket_server.daemon = True + self.th_websocket_server.start() + + def stopWebSocketServer(self): + """WebSocketサーバーを停止する""" + if not hasattr(self, 'th_websocket_server') or self.th_websocket_server is None: + return + + self.websocket_server_loop = False + + try: + # 一定時間待機してからタイムアウト + self.th_websocket_server.join(timeout=2.0) + + if self.th_websocket_server.is_alive(): + # タイムアウト後もスレッドが生きている場合の処理 + self.logger.warning("WebSocket server thread did not terminate properly") + except Exception: + errorLogging() + finally: + self.th_websocket_server = None + self.websocket_server = None + self.websocket_server_alive = False + + def checkWebSocketServer(self): + """WebSocketサーバーの稼働状態を確認する""" + return self.websocket_server_alive + + def websocketSendMessage(self, message_dict:dict): + """ + WebSocketサーバーから全クライアントにメッセージを送信する + :param message_dict: 送信するメッセージの辞書 + :return: 送信成功したかどうか + """ + if not self.websocket_server_alive or not self.websocket_server: + return False + try: + message_json = json.dumps(message_dict) + return self.websocket_server.send(message_json) + except Exception: + errorLogging() + return False + model = Model() \ No newline at end of file diff --git a/src-python/models/websocket/websocket_server.py b/src-python/models/websocket/websocket_server.py index f01122a9..34762e55 100644 --- a/src-python/models/websocket/websocket_server.py +++ b/src-python/models/websocket/websocket_server.py @@ -14,7 +14,7 @@ class WebSocketServer: - メッセージのブロードキャスト機能 - GUIスレッド等からメッセージ送信するためのキュー """ - def __init__(self, host: str='localhost', port: int=8765): + def __init__(self, host: str='127.0.0.1', port: int=8765): """ サーバーのホスト名とポートを指定して初期化します。 """