def __init__(self, delay=0.0): self.netstream = netstream.netstream() self.delay = int(delay * 1000) / 2 self.noisy = int(self.delay * 2 / 3) self.tbase = time.time() self.block = 0 self.sendmsg = [] self.recvmsg = []
def on_connect (self, **kw): self.mask = 0 ipv6 = False bracket = False text = self.remote.get().strip('\r\n\t ') addr = '' for ch in text: if not bracket: if ch == '[': bracket = True else: ipv6 = True if ch == ']': bracket = False elif ch == ':': ch = '.' addr += ch if not ':' in addr: return self.address_error(text) part = addr.split(':') if not len(part) in (2, 3): return self.address_error(text) port = 0 try: port = int(part[1]) except: return self.address_error(text) if port == 0: self.append('port can not be zero\n', COLOR_ERROR) return 0 head = -1 if len(part) == 3: try: head = int(part[2]) if head < 0 or head > 13: self.append('format must >= 0 and <= 13\n', COLOR_ERROR) return 0 except: pass names = { 'WORDLSB': 0, 'WORDMSB':1, 'DWORDLSB':2, 'DWORDMSB':3, 'BYTELSB': 4, 'BYTEMSB': 5, 'EWORDLSB': 6, 'EWORDMSB': 7, 'EDWORDLSB': 8, 'EDWORDMSB': 9, 'EBYTELSB': 10, 'EBYTEMSB': 11, 'DWORDMASK': 12, 'RAWDATA': 13, 'RAW': 13 } if head < 0 and part[2].upper() in names: head = names.get(part[2].upper(), -1) if head < 0: self.append('format "%s" invalid\n'%part[2], COLOR_ERROR) return 0 ips = part[0].split('.') if not ipv6: if len(ips) != 4: return self.address_error(text) try: n = [ int(x) for x in ips ] for x in n: if x < 0 or x > 255: self.append('ip address "%s" invalid\n'%part[0], COLOR_ERROR) return 0 except: self.append('ip address "%s" invalid\n'%part[0], COLOR_ERROR) return 0 if self.sock: self.sock.close() self.sock = None ip = part[0].replace('[', ' ').replace(']', ' ').strip('\r\n\t ') if ipv6: ip = ip.replace('.', ':') self.sock = netstream.netstream(head) try: self.sock.connect(ip, port, head) except Exception, e: self.append('ip address "%s" invalid: %s\n'%(text, str(e)), COLOR_ERROR) self.sock.close() self.sock = None return 0
#coding: gbk import netstream client = netstream.netstream() client.connect('127.0.0.1', 32005) client.nodelay(0) client.nodelay(1) report = { 'cid': 0x01, 'ctype': 0x11, 'scnt': 198, 'iostat': 0xAA, #0xAA, 0x55 'stot': 200, 'stat': 0x00, 'counter': 0x01, } client.send_report(report) client.close()
def process(self): current = time.time() if self.state != gvars.NET_STATE_ESTABLISHED: return 0 sock = None try: sock, remote = self.sock.accept() sock.setblocking(0) except: pass # 最大支持65536个客户端连接 if self.count >= 0x10000: try: sock.close() except: pass if sock: pos = -1 #找到空位 for i in xrange(len(self.clients)): if self.clients[i] == None: pos = i break #没找到空位则新增 if pos < 0: pos = len(self.clients) self.clients.append(None) hid = (pos & 0xffff) | (self.index << 16) self.index += 1 if self.index >= 0x7fff: self.index = 1 client = netstream.netstream() client.assign(sock) client.hid = hid client.tag = -1 client.active = current client.peername = sock.getpeername() self.clients[pos] = client self.count += 1 self.queue.append((gvars.NET_NEW, hid, 0, repr(client.peername))) log.info('client connected, peer: %s, pos: %d, index: %d'%(client.peername, pos, self.index-1)) for pos in xrange(len(self.clients)): client = self.clients[pos] if not client: continue #handle client message client.process() # log.debug('try recv client data...., client stats: %d'%client.status()) while client.status() == gvars.NET_STATE_ESTABLISHED: data = client.recv() if data is None: break self.queue.append((gvars.NET_DATA, client.hid, client.tag, data)) client.active = current # handle client leave timeout = current - client.active if (client.status() == gvars.NET_STATE_STOP) or (timeout >= self.timeout): hid, tag = client.hid, client.tag self.queue.append((gvars.NET_LEAVE, hid, tag, '')) self.clients[pos] = None client.close() log.info('client leave, peer: %s, pos: %d'%(client.peername, pos)) del client self.count -= 1 current = long(time.time()* 1000) if current - self.timeslap > 100000: self.timeslap = current period = self.period if period > 0: while self.timeslap < current: self.queue.append(gvars.NET_TIMER, 0, 0, '') self.timeslap += period return 0