zoukankan      html  css  js  c++  java
  • [转]用python来开发webgame服务端(2)

        [刺鸟原创文章,转载请注明出处]


        就在刚才,我们用基于python下的Twisted库写了一个简单的socket服务器,不知道它的性能和基本的承载到底如何呢?接下来,我们作一个简单的测试。

        说是简单的测试,一点也不假,因为这确实只是最基本的测试,流程是这样的:用python写一个客户端,设定连接数,然后向我们指定的端口发起socket连接,连接成功后,向服务端发送一个字符串并一直保持连接状态,服务端在收到客户端的内容后,向它回复:bingo!i got your msg:{content}。

        好啦,有了需求,开始动手吧!把我们之前的服务端代码略作修改:

    1. from twisted.internet.protocol import Factory,Protocol
    2. from twisted.internet import reactor
    3. class gameSocket(Protocol):
    4.     #有新用户连接至服务器
    5.     def connectionMade(self):
    6.         print 'New Client'
    7.     
    8.     #客户端断开连接
    9.     def connectionLost(self,reason):
    10.         print 'Lost Client'
    11.     
    12.     #收到客户端发送数据
    13.     def dataReceived(self, data):
    14.         print 'Get data:' + str(data)
    15.         #向该客户端发送数据
    16.         self.transport.write('bingo!i got your msg:'+ str(data))
    17. if __name__=='__main__':
    18.     f = Factory()
    19.     f.protocol = gameSocket
    20.     reactor.listenTCP(5200,f)
    21.     print 'server started...'
    22.     reactor.run()


        接下来,是要写一个客户端来连接它,然后用消息炸弹轰炸它!为了让客户端能高并发的测试,我选择了Stackless Python,来吧:

    1. import socket,stackless
    2. sockIndex = 1
    3. def connToServer ():
    4.     global sockIndex
    5.     #创建一个socket连接到127.0.0.1:5200,并发送内容
    6.     conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    7.     conn.connect(("127.0.0.1", 5200))
    8.     conn.send("hi,I'm NO."+ str(sockIndex))
    9.     print sockIndex
    10.     sockIndex = sockIndex + 1
    11.     while True:
    12.         #等待服务端返回数据,并输出
    13.         rev = conn.recv(1024)
    14.         print 'get server msg:' + str(rev)
    15.         stackless.schedule()
    16. #先来500个并发试试
    17. for i in range(0,500):
    18.     stackless.tasklet(connToServer)()
    19. stackless.run()


    准备就绪!开火!


        毫无压力,瞬间所有的连接全部都处理完成。那我们来加大火力,将客户端代码中的500修改为3000试试看。


        悲剧了,当客户端连接成功512个之后,服务端开始报错,难道python+Twisted如此的不堪一击?非也,经过查阅Twisted的官方文档,我们会发现,twisted默认用的是select()模式,而Windows的对文件描述符有一定限制,这个限制值是512,在Linux的下这个限制为1024, 如果超过这个限制值,就会出现上面的异常。如果要在windows中有更好的表现,看来得用iocp,而linux下,用epoll则是更合适的方案,而Twisted自身就已经支持了这2种模式,看看如何启用:
    windows:

    1. from twisted.internet import iocpreactor
    2. iocpreactor.install()


    linux:

    1. from twisted.internet import epollreactor
    2. epollreactor.install()


        我的程序是在windows上开发的,最终部署到linux上,所以得写一个简单的判断来根据系统选择对应的模式,完整的服务端代码调整为:

    1. import os
    2. if os.name!='nt':
    3.     from twisted.internet import epollreactor
    4.     epollreactor.install()    
    5. else:
    6.     from twisted.internet import iocpreactor
    7.     iocpreactor.install()
    8. from twisted.internet.protocol import Factory,Protocol
    9. from twisted.internet import reactor
    10. class gameSocket(Protocol):
    11.     #有新用户连接至服务器
    12.     def connectionMade(self):
    13.         print 'New Client'
    14.     
    15.     #客户端断开连接
    16.     def connectionLost(self,reason):
    17.         print 'Lost Client'
    18.     
    19.     #收到客户端发送数据
    20.     def dataReceived(self, data):
    21.         print 'Get data:' + str(data)
    22.         #向该客户端发送数据
    23.         self.transport.write('bingo!i got your msg:'+ str(data))
    24. if __name__=='__main__':
    25.     f = Factory()
    26.     f.protocol = gameSocket
    27.     reactor.listenTCP(5200,f)
    28.     print 'server started...'
    29.     reactor.run()


        我们再来试试刚才的3000个连接。


        OK,这次顺利的连接上了,在我用如上代码对工作机进行简单测试时,同时上万个连接无压力,而在实际的webgame应用环境中,达到上万个连接的可能性不大,当然,这里只是简单的连接,并未处理游戏逻辑,因此不能作为最终结论。
        不过就算单台服务器处理不过来,只要程序构架合理,我们也还可以将服务端分布到不同的服务器,所以,单从socket并发这点来看,python已经达到了我的需求。我将以以上服务端代码作为原型,来尝试开发一个webgame的服务端。

  • 相关阅读:
    利用dockerfile定制镜像
    发布Docker 镜像到dockerhub
    Docker 停止容器
    133. Clone Graph
    132. Palindrome Partitioning II
    131. Palindrome Partitioning
    130. Surrounded Regions
    129. Sum Root to Leaf Numbers
    128. Longest Consecutive Sequence
    127. Word Ladder
  • 原文地址:https://www.cnblogs.com/pylemon/p/2168950.html
Copyright © 2011-2022 走看看