1 from queue
import Queue
2 from lib
.engine
.network
.network
import AbsNetwork
, NetworkThread
, msg_rpc_call
3 from lib
.engine
.network
.binary
import BinaryData
6 class ClientThread(NetworkThread
):
8 def __init__(self
, srv_addr
, eng
, port
):
9 self
.srv_addr
= srv_addr
10 NetworkThread
.__init
__(self
, eng
, port
)
12 self
.rpc_ret
= Queue()
14 def _configure_socket(self
):
15 self
.tcp_sock
.connect((self
.srv_addr
, self
.port
))
17 def _rpc_cb(self
, data
, sock
):
18 self
.rpc_ret
.put(data
)
20 def _queue(self
, sock
):
23 def send_msg(self
, msg
, receiver
=None): self
.msgs
.put(msg
)
25 def do_rpc(self
, funcname
, *args
, **kwargs
):
27 msg_size
, msg_data
= BinaryData
.pack(
28 [msg_rpc_call
, funcname
, args
, kwargs
])
29 self
.msgs
.put((msg_size
, msg_data
))
30 return self
.rpc_ret
.get()
33 class Client(AbsNetwork
):
35 def __init__(self
, port
, srv_addr
):
36 AbsNetwork
.__init
__(self
, port
)
37 self
.srv_addr
= srv_addr
40 def start(self
, read_cb
):
41 return AbsNetwork
.start(self
, read_cb
)
43 def _bld_netw_thr(self
):
44 srv
, port
= self
.srv_addr
.split(':')
45 return ClientThread(srv
, self
.eng
, int(port
))
47 def _configure_udp(self
): pass
49 def send_udp(self
, data_lst
, sender
):
50 host
, port
= self
.srv_addr
.split(':')
51 msg_size
, msg_data
= BinaryData
.pack([sender
] + data_lst
)
52 self
.udp_sock
.sendto(msg_data
, (host
, int(port
)))
54 def register_rpc(self
, funcname
): self
._functions
+= [funcname
]
56 def unregister_rpc(self
, funcname
): self
._functions
.remove(funcname
)
58 def __getattr__(self
, attr
):
59 if attr
not in self
._functions
: raise AttributeError(attr
)
61 def do_rpc(*args
, **kwargs
):
62 return self
.netw_thr
.do_rpc(attr
, *args
, **kwargs
)