#!/usr/bin/env python # file: tmp.py import sys, time import threading, socket, select ipinfo = ('localhost', 55555) sendata = ['=======', 'you ', 'are', 'pig!', 'bye'] class ServThread(threading.Thread): def __init__(self, socketid): threading.Thread.__init__(self) self.socketid = socketid self.fileno = socketid.fileno() self.event = None self.srv = None def run(self): self.srv = select.poll() print '** created serv poll object' try: self.srv.register(self.fileno, select.POLLIN | select.POLLOUT | select.POLLHUP) except: print '======= Error 1 ====' self.srv.unregister(self.socketid) sys.exit(0) print '** registered srv ...' self.socketid.bind(ipinfo) print '** binded ...' self.socketid.listen(1) print '** listened and waitting client...' self.event = self.srv.poll() print '** svr polled' conn, addr = self.socketid.accept() print '** accepted %s...' % str(addr) try: while 1: conn.send('** Request sending data now') print '** send to client' print id(self.srv) self.srv.poll()# blocked here ? print '** polled in connected status' recvdata = conn.recv(64) if recvdata == 'bye': print '** Exit now' break else: print '** Received --> %s ' % recvdata finally: self.socketid.close() print '** closed in srv' pass class ClientThread(threading.Thread): def __init__(self, socketid): threading.Thread.__init__(self) self.socketid = socketid self.fileno = socketid.fileno() self.event = None self.client = None def run(self): print 'Run after ClientThread created' self.client = select.poll() print 'created client poll object' try: self.client.register(self.fileno, select.POLLOUT | select.POLLIN | select.POLLHUP) except: print '======= Error 2 ====' self.client.unregister(self.socketid) sys.exit(0) print 'registered client ...' print 'Now connect to server ...' self.socketid.connect(ipinfo) print 'server connected...' try: print "Iterating" time.sleep(2) for data in sendata: print id(self.client) self.client.poll() print 'clinet recved notify' recvstr = self.socketid.recv(64) print 'recv --> %s' % recvstr self.socketid.send(data) print 'notify to svr' finally: self.socketid.close() print 'closed in client' mainsock1 = socket.socket (socket.AF_INET, socket.SOCK_STREAM) mainsock1.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) mainsock2 = socket.socket (socket.AF_INET, socket.SOCK_STREAM) mainsock2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) mainsock1.settimeout(10) mainsock2.settimeout(10) aa1 = ServThread(mainsock1) aa1.setDaemon(True) aa1.start() ClientThread(mainsock2).start() print '================ Testing Start ================='