forked from kbengine/kbengine
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPoller.py
More file actions
67 lines (57 loc) · 1.61 KB
/
Copy pathPoller.py
File metadata and controls
67 lines (57 loc) · 1.61 KB
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# -*- coding: utf-8 -*-
import KBEngine
import Functor
import socket
from KBEDebug import *
class Poller:
"""
演示:
可以向kbengine注册一个socket,由引擎层的网络模块处理异步通知收发。
用法:
from Poller import Poller
poller = Poller()
开启(可在onBaseappReady执行)
poller.start("localhost", 12345)
停止
poller.stop()
"""
def __init__(self):
self._socket = None
self._clients = {}
def start(self, addr, port):
"""
virtual method.
"""
self._socket = socket.socket()
self._socket.bind((addr, port))
self._socket.listen(10)
KBEngine.registerReadFileDescriptor(self._socket.fileno(), self.onRecv)
# KBEngine.registerWriteFileDescriptor(self._socket.fileno(), self.onWrite)
def stop(self):
if self._socket:
KBEngine.deregisterReadFileDescriptor(self._socket.fileno())
self._socket.close()
self._socket = None
def onWrite(self, fileno):
pass
def onRecv(self, fileno):
if self._socket.fileno() == fileno:
sock, addr = self._socket.accept()
self._clients[sock.fileno()] = (sock, addr)
KBEngine.registerReadFileDescriptor(sock.fileno(), self.onRecv)
DEBUG_MSG("Poller::onRecv: new channel[%s/%i]" % (addr, sock.fileno()))
else:
sock, addr = self._clients.get(fileno, None)
if sock is None:
return
data = sock.recv(2048)
DEBUG_MSG("Poller::onRecv: %s/%i get data, size=%i" % (addr, sock.fileno(), len(data)))
self.processData(sock, data)
KBEngine.deregisterReadFileDescriptor(sock.fileno())
sock.close()
del self._clients[fileno]
def processData(self, sock, datas):
"""
处理接收数据
"""
pass