首页 > 代码库 > Twisted 库 TCP 服务器 心跳包demo

Twisted 库 TCP 服务器 心跳包demo

最近刚刚接触 twisted 库,感觉twisted 库的设计模式和平时接触的socket 通信很大不同, 感觉有点不大适应,为了增加自己对twisted 的适应度, 同时也熟悉一下心跳包的机制。 

特地写了一个  基于twisted 库的 TCP  服务器 心跳包 demo

以供练习之用。 同时也和大家分享 python 编程心得 微笑

demo 特性描述:

1   TCP服务器支持多客户端连接, 每次客户端连接之后,直接将客户端信息(IP 地址, 端口号)存储到字典当中。 并且启动Svr_unit 程序定时器(30s 响应)

2  服务器接受到数据之后, 分析 发送数据段的信息 (IP地址,端口号) , 如果数据信息与字典的数据匹配, 则直接调用 对于的Svr_unit 进行数据处理(返回发送数据), 同时刷新定时器,重新定时

3  如果Svr_unit 对象定时器超时, 则调用服务器的函数,将自身从服务器 中的字典中自我移除, 提示连接断开


<span style="font-size:14px;"><span style="font-size:18px;"># -*- coding: utf-8 -*-
"""
Created on 2014/11/25
@author: LEO
"""

from twisted.internet import  protocol, reactor
import  threading


class Svr(object):
    def __init__(self):
        reactor.listenTCP(8000 , svrfactory())

    def Run(self):
        reactor.run()


class svrfactory(protocol.Factory):
    def buildProtocol(self, addr):
        return  Serveport()

class Serveport(protocol.Protocol):
    def __init__(self):
        self._svrunit = dict()

    def connectionMade(self):
        ipinfo = self.transport.getPeer()
        print  ipinfo,'connect server'
        self.Deal_connect(ipinfo)

    def connectionLost(self, reason):
        print 'connection lost for : \n' , reason

    def dataReceived(self, data):
        pipv4 = self.transport.getPeer()
        if data is not None:
            self.Deal_datarecieve(data , pipv4)

    def dataSend(self, data):
        if data is None:
            return
        else:
            self.transport.write(data)

    def Deal_connect(self , pipv4):
        if pipv4 not in self._svrunit:
            print 'new a client' , pipv4
            pclient = Svr_unit( self , pipv4)
            self._svrunit[pipv4] =pclient

    def Deal_disconnect(self ):
        pass

    def Deal_datarecieve(self, data, pipv4):
        if pipv4 in self._svrunit:
            print 'recieve data from ' , pipv4
            self._svrunit[pipv4].Echo(data)
        else:
            print 'warming:'
            print 'recieve data from unknow client' ,pipv4

    def Remove_client(self, pipv4):
        if pipv4 in self._svrunit:
            print 'warming: '
            print pipv4 , 'is over time '
            del self._svrunit[pipv4]
        else:
            print 'not found the client in the list '


class Svr_unit(object):
    def __init__(self,  svrhanle ,pipv4):
        self.srv = svrhanle
        self.ipv4 = pipv4
        # start the timer for heatbeat
        self.timer = threading.Timer(30, self.Terminate )
        self.timer.start()

    def Echo(self , data):
        if data is not None:
            self.Reset_timer()
            pstr = 'echo from server : '+ data
            self.srv.dataSend(pstr)


    def Reset_timer(self):
        """
        reset the anticlock once class had recieve the heart beat signal  """
        print 'reset the timer for heart beat '
        self.timer.cancel()
        self.timer = threading.Timer(20, self.Terminate )
        self.timer.start()

    def Terminate(self):
        '''over time operation :
           remove current class from server list , so that it would never recieve any
           data '''
        self.srv.Remove_client(self.ipv4)


def main():
    svrend = Svr()
    svrend.Run()


if __name__ == '__main__':
    main()
</span></span>

python 编程心得:

1   相比于C++ 编程, python 这种动态脚本语言来实现 面向对象的思想, 那简直是飞一般的感觉。  类之间的相关调用那是行云流水般的舒适。 相互嵌套调用的实现也是非常简单。 用非常少的代码,可是快速实现相当复杂的逻辑关系。 非常棒。 

2  对于python 的编程命令方式, 现在感觉自己非常错乱, 不同的库,采用不同的命名规则, 自己的代码中的变量和函数命名也相当混乱。 希望有人能推荐一种比较适合python 的命名方法,能够解决 python 类内 私有和公有 封装的命名方式

Twisted 库 TCP 服务器 心跳包demo