免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4746 | 回复: 6
打印 上一主题 下一主题

twisted使用时客户端连接不上,请高手指点! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-24 13:24 |只看该作者 |倒序浏览
问题:最近学习使用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 编辑 ]

code.rar

1.59 KB, 下载次数: 47

论坛徽章:
0
2 [报告]
发表于 2009-06-24 14:07 |只看该作者
这个可能跟系统设置有关,我去查查看

论坛徽章:
0
3 [报告]
发表于 2009-06-24 22:49 |只看该作者
twisted默认使用 select,一个办法是ulimit -n 655360加大 fd handle 的数量,一个是twisted程序使用epollreactor

评分

参与人数 1可用积分 +1 收起 理由
smallfish_xy + 1 我很赞同

查看全部评分

论坛徽章:
0
4 [报告]
发表于 2009-06-25 08:47 |只看该作者
原帖由 flaman 于 2009-6-24 22:49 发表
twisted默认使用 select,一个办法是ulimit -n 655360加大 fd handle 的数量,一个是twisted程序使用epollreactor

恩,epollreactor.install()这个方法,不过还是用ulimit修改下把,这个比较快捷,也适合其他用

论坛徽章:
0
5 [报告]
发表于 2009-06-25 12:33 |只看该作者
我是在windows2003下做的,使用iocpreactor跑起来了啊,这个不是能够支持大并发量吗?
现在问题不是要求它有多大的并发量,关键是大并发量时一旦连不上,服务端就完了(把所有客户端全部关掉,再去连也连不上了),服务端就必须手工去重启一下.
另外:
ulimit -n 655360加大 fd handle 的数量
不好意思问一下windows下这个怎么用啊?

论坛徽章:
0
6 [报告]
发表于 2009-06-25 22:34 |只看该作者
原帖由 moatlzy 于 2009-6-25 12:33 发表
我是在windows2003下做的,使用iocpreactor跑起来了啊,这个不是能够支持大并发量吗?
现在问题不是要求它有多大的并发量,关键是大并发量时一旦连不上,服务端就完了(把所有客户端全部关掉,再去连也连不上了),服务 ...


IOCP 还在实验中.不推荐使用. twisted的程序,还是老实在linux,bsd上面跑吧

论坛徽章:
0
7 [报告]
发表于 2009-06-26 10:17 |只看该作者
啊,好痛苦!还以为twisted对windows的支持很好......
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP