1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
òóic@s¼dZddlZddlZddlZddlZddlZddlmZddlm    Z    ddl
m Z ddl m Z ddlmZdd d    „ƒYZd
d d „ƒYZdS(sJ
EventServerÖ÷·þÎñÆ÷Ä£¿é
ʵÏÖTCP·þÎñÆ÷,½ÓÊÕÓÎÏ·¿Í»§¶Ëʼþ²¢¼Ç¼µ½±¾µØÎļþ
iÿÿÿÿN(t ConfigReader(t
ClientsMgr(tFileMgr(tPacketProcessor(t packet_loggert
ConnectioncBs;eZdZd„Zd„Zd„Zd„Zd„ZRS(s
Á¬½Ó·â×°ÀàcCsz||_||_||_||_t|_d|_tjƒ|_    tj
d|j ƒ|_ t|j _ |j jƒdS(Ntttarget(tsocktaddrtcidtpacket_processortTruetrunningt recv_buffert    threadingtLocktlocktThreadt
_recv_loopt recv_threadtdaemontstart(tselfRR    R
R ((s .\\server.pyt__init__s                         cCsëxÚ|jrÜy‚tj|jgggdƒ\}}}|r|jjdƒ}|sXPn|j'|j|7_x|jƒrƒqtWWdQXnWqtjk
r¶}dt    |ƒGHPqt
k
rØ}dt    |ƒGHPqXqW|j ƒdS(s ½ÓÊÕÊý¾ÝÑ­»·gð?i€Ns[Connection] Socket error: %ss[Connection] Error: %s( R tselectRtrecvRRt_try_parse_packettsocketterrortstrt    Exceptiontclose(Rtreadablet_tdatate((s .\\server.pyR&s$ '
    c    CsCddl}d}d}d}t|jƒ|kr7tS|jd|jdd!ƒd}||krtjd    ||jfd
ƒd |_tS|jd|jdd!ƒd}||krætjd |||jfd
ƒd |_tS||}t|jƒ|kr    tS|j||!}|j||_|jj|j    |ƒt
S( s³¢ÊÔ½âÎöÊý¾Ý°üiÿÿÿÿNiiÿÌi s<Hiis1Invalid magic code: 0x%04X, clear buffer data: %stWARNRs>Packet length %d exceeds max %d, clear buffer. Buffer data: %s( tstructtlenRtFalsetunpackRtlog_textR t
add_packetR
R (    RR&tPACKET_HEADER_SIZEtPACKET_HEADER_MCtMAX_PACKET_LENt
magic_codet
packet_lent    total_lent packet_data((s .\\server.pyRHs.              
cCsBy|jj|ƒtSWn#tk
r=}dt|ƒGHtSXdS(s·¢ËÍÊý¾Ýsonnection] Send error: %sN(RtsendallR RRR((RR#R$((s .\\server.pytsendvs cCs_|jrt|_n|jrEy|jjƒWnnXd|_ntjƒj|jƒdS(s¹Ø±ÕÁ¬½ÓN(    R R(RR tNoneRtinstanceton_client_disconnectR
(R((s .\\server.pyR s          (t__name__t
__module__t__doc__RRRR4R (((s .\\server.pyRs         "    .        t EventServercBsVeZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z    d„Z
RS(    s
ʼþ·þÎñÆ÷cCsstjƒ|_t|jƒ|_t|jƒ|_d|_i|_    d|_
t j ƒ|_ t|_d|_dS(Ni(RR6tconfigRtfile_mgrRR R5t server_sockt connectionstnext_cidRRRR(R t accept_thread(R((s .\\server.pyR’s                cCs$|jjƒ}tjtjtjƒ|_|jjtjtjdƒy§|jj    d|fƒ|jj
dƒd|GHd|jj ƒGHd|jj ƒGHdGH|j jƒt|_tjd|jƒ|_t|j_|jjƒtSWn0tk
r}d    t|ƒGH|jjƒtSXd
S( s
Æô¶¯·þÎñÆ÷is0.0.0.0is'[EventServer] Server started on port %ds[EventServer] Log path: %ss[EventServer] Write mode: %dRRs([EventServer] Failed to start server: %sN(R<tget_listen_portRtAF_INETt SOCK_STREAMR>t
setsockoptt
SOL_SOCKETt SO_REUSEADDRtbindtlistentget_log_file_pathtget_write_modeR RR R RRt _accept_loopRARRRR R((RtportR$((s .\\server.pyRžs(            cCs+x$|jr&yÀtj|jgggdƒ\}}}|rË|jjƒ\}}|j|j}|jd7_WdQXt||||jƒ}|j||j|<WdQXd||d|dfGHnWqt    j
k
r}|jrüdt |ƒGHnPqt k
r"}dt |ƒGHPqXqWdS(s ½ÓÊÜÁ¬½ÓÑ­»·gð?iNs*[EventServer] New connection %d from %s:%dis[EventServer] Accept error: %ss[EventServer] Error: %s( R RR>tacceptRR@RR R?RRRR(RR!R"t client_sockR    R
t
connectionR$((s .\\server.pyRL¿s& '
    
!    cCs!|jt|jƒSWdQXdS(s
»ñÈ¡Á¬½ÓÊýN(RR'R?(R((s .\\server.pytget_connection_countÜs
cCs |jjƒS(s»ñÈ¡°ü¶ÓÁдóС(R tget_queue_size(R((s .\\server.pyRRáscCs |jjƒS(s»ñÈ¡³É¹¦Ð´Èë´ÎÊý(R=tget_success_count(R((s .\\server.pyRSåscCs |jjƒS(s»ñȡʧ°ÜдÈë´ÎÊý(R=tget_fail_count(R((s .\\server.pyRTéscCs¦|js dSdGHt|_|j6x!|jjƒD]}|jƒq5W|jjƒWdQX|jjƒ|j    ry|j    jƒWqqXn|j
j ƒdGHdS(s
Í£Ö¹·þÎñÆ÷Ns [EventServer] Stopping server...s[EventServer] Server stopped( R R(RR?tvaluesR tclearR tstopR>R=t    close_all(Rtconn((s .\\server.pyRWís         
      ( R8R9R:RRRLRQRRRSRTRW(((s .\\server.pyR;s         !                    (((R:tsysRRRtdatetimeR<Rtclients_managerRt file_managerRR RRRR;(((s .\\server.pyt<module>s     z