- 论坛徽章:
- 0
|
问题:最近学习使用twisted!按示例做个简单的服务端,发现在客户端并发超过1000时(有时会多几个),服务端就连不上了!并且在这种情况下,再把所有的客户端都强制(暴力)关掉后,发现服务端就没用了(这时一个客户端都连不上了)!附上代码,请高手指点!谢谢先!
不好意思,代码写的比较乱!(补充:windows2003+python2.54+twisted8.2.0)
#-----------testsrv.py-----------------服务端
#coding=gbk
import time,string,sys
from twisted.internet.protocol import Protocol,Factory
from twisted.internet import iocpreactor#IOCP
iocpreactor.reactor.install()
from twisted.internet import reactor
class PMSFactory(Factory):
errnum = 0
class Echo(Protocol):
def connectionMade(self):
self.factory.numPorts += 1
def connectionLost(self, reason):
if reason.getErrorMessage()[-13:] == 'unknown (64).':#好象客户端异常断开一定的数量后,客户端就连不上了
self.factory.errnum += 1
self.factory.numPorts -= 1
print '客户端非正常断开数总计:',self.factory.errnum
def dataReceived(self,data):
print '当前客户端总数:',self.factory.numPorts
self.transport.write(data)
f = PMSFactory()
f.protocol = Echo
reactor.listenTCP(8025,f)
reactor.run()
#-----------clnt.py-----------------客户端
#coding=gbk
import socket,time,threading,random,struct,datetime,traceback
threadnum=300
ROUNDTMS = 20000
def randomquery(ip,port,slptm,threadnum):
print ip,port
s = SockClnt((ip, port))
stp = 0
while stp < ROUNDTMS:
stp += 1
id=random.randint(70000,200000)
tf=time.clock()
v=s.request("你好测试一下!")
tmslt=(time.clock()-tf)*1000
print '[%05dThread--%8.2f毫秒]' % (threadnum,tmslt),
time.sleep(slptm)
class SockClnt:
def __init__(self,addr):
self.desaddr = addr
self.__connect()
return
def __connect(self):
self.conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
self.conn.connect(self.desaddr)
except:
traceback.print_exc()
return
def __del__(self):
self.conn.close()
def __reconnect(self):
try:
self.conn.close()
self.__connect()
except:
traceback.print_exc()
return
def send(self, data):
try:
self.conn.sendall(data)
return True
except:
self.__reconnect()
traceback.print_exc()
return False
def recv(self):
buf=''
try:
buf = self.conn.recv(1024)
except socket.error, argtp:
self.__reconnect()
print argtp
except:
traceback.print_exc()
return buf
def request(self,data):
if self.send(data):
getmsg = self.recv()
if not getmsg:
return (-1, 'net receive data error or data format error!')
return (1, getmsg)
else:
return (-2, 'net send error!')
if __name__ == '__main__':
srvip='127.0.0.1'
srvport=8025
srv = raw_input("服务器[default:%s,%d]:" % (srvip, srvport))
try:
srvip,srvport=srv.strip().split(',')
srvport=int(srvport)
except:
pass
tn = raw_input("线程数[default:%d]" % threadnum)
tmscnt = 0
while 1:
tmscnt+=1
THREADLST=[]
ddd = 0
try:
ddd = int(tn)
except:
ddd = threadnum
for i in range(ddd):
ct = threading.Thread(target = randomquery, args = (srvip, srvport, 0.1,i))
ct.setName('T_%d' % i)
THREADLST.append(ct)
for t in THREADLST:
t.start()
for t in THREADLST:
t.join()
print "新的循环开始................................................................"
[ 本帖最后由 moatlzy 于 2009-6-24 14:17 编辑 ] |
|