45 lines
1.1 KiB
Python
45 lines
1.1 KiB
Python
from typing import Any, Optional, Final
|
|
from enum import IntEnum, auto
|
|
import socket
|
|
import json
|
|
|
|
WORKER_PORT: Final[int] = 7861
|
|
HEADER_SIZE: Final[int] = 4
|
|
|
|
|
|
class RequestType(IntEnum):
|
|
STATUS = auto()
|
|
QUIT_SERVER = auto()
|
|
PYOPENJTALK = auto()
|
|
|
|
|
|
class ConnectionClosedException(Exception):
|
|
pass
|
|
|
|
|
|
# socket communication
|
|
|
|
|
|
def send_data(sock: socket.socket, data: dict[str, Any]):
|
|
json_data = json.dumps(data).encode()
|
|
header = len(json_data).to_bytes(HEADER_SIZE, byteorder="big")
|
|
sock.sendall(header + json_data)
|
|
|
|
|
|
def _receive_until(sock: socket.socket, size: int):
|
|
data = b""
|
|
while len(data) < size:
|
|
part = sock.recv(size - len(data))
|
|
if part == b"":
|
|
raise ConnectionClosedException("接続が閉じられました")
|
|
data += part
|
|
|
|
return data
|
|
|
|
|
|
def receive_data(sock: socket.socket) -> dict[str, Any]:
|
|
header = _receive_until(sock, HEADER_SIZE)
|
|
data_length = int.from_bytes(header, byteorder="big")
|
|
body = _receive_until(sock, data_length)
|
|
return json.loads(body.decode())
|