最近刚刚接触 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 类内 私有和公有 封装的命名方式
原文:http://blog.csdn.net/leos_blog/article/details/41517815