python 实现 TCPServer,第1张

python 实现 TCPServer,第2张

用Python写了一个简单的TCPServer,放到一台Linux服务器上,目前可以从设备通过TCP连接接收十六进制消息.
我的最终目的是使得TCPServer能够接收上万台设备发来的十六进制消息,然后解析并存到数据库里。
当然目前仅仅需要接收几台设备的信息,但现在遇到了一些问题:
(设备都用DTU代替,放在服务器上的脚本用DSC代替)
1、 当多个DTU向DSC建立链接并发送数据包时,需要把当前连接保存起来,并最好有一个序号,保存到dtu_list中。当该连接断开时可以从dtu_list中根据序号删除。
2、 这是一个基本的示例 https://docs.python.org/2/library/socketserver.html#SocketServer.BaseServer.RequestHandlerClass
,但实际情形比这复杂多。 在ThreadedTCPServer中能不能根据当前连接的ID,有选择的发送数据。

大家如果有这方面的编程例子,感谢能提供一个链接或者参考。 ----------------------- 以下是精选回复-----------------------

答:你用ThreadedTCPServer这种线程模型上万台设备肯定不行,现在你几台OK,随着设备数量增多线程将会变多,整个程序效率就会更低,线程模型如果有大量的锁,这个问题变得更复杂,这就是现在基本上没有高并发Server会使用这种模型的原因。

python线程数量是有限制的,在win下面甚至不能超过1K,考虑最坏的情况如果有1K个设备同时建立连接,更多的设备心跳就接收不到。
答:官方文档的参考还不够吗?
官方的smtpd代码可以看一下,就是实例之一。
答:zeromq?
答:别用这货了,现在成熟的异步框架多了去了tornodo twisted之类的...
答:同楼上smtpd,可以理解基本思路
如果上异步的话可以试试我写的gsmtpd

https://github.com/34nm/gsmtpd

C10K 下 最多7000RPS 一个进程 楼主想更高的话只能上multiprocess了,更高的话找LVS HAPROXY之类的吧
答:如果你的业务逻辑就是建立设备连接的时候开始创建一个记录,然后不断把设备上发的数据存起来,然后链接断开的时候把它删除掉,我建议你直接用twisted就可以。自带的例程就可以帮助你搞定这件事情。

记住打开epoll模式,可以把性能提升很多。
但是twisted里面不要想当然的呼叫引发阻塞的操作,比如数据库写,sleep,io等等,因为如果你需要一个这样的操作,需要查手册里面对于这种需求的对应方案。

如果你不习惯这种编程模式,我建议你使用go 写一个,学习难度和你学twisted 差不多,但是至少你可以用线性的思维写一个性能不错的tcp 服务器。
答:还有一个能用的东西叫做 gevent,也不错。
答:上万台设备,你得用cassandra,否则怎么撑的住?
答:用twisted吧,用起来相当不错,性能也够用!
答:非常感谢大家的回复, 看到大家的回复都比较专业,看来这样的应用还是应该花钱让公司找人去做,目前并不太可能有超过上百个设备的,那是以后的事了,现在这个问题还没有很好的解决,实现的过程很简陋,虽然也能接收数据,发送数据但感觉不太优雅。

目前如果按照我上面的代码,如何实现把每个连接放在一个列表里,并且可以随时操作其中一个连接。当前连接应该包含设备的id, ip, 等一些信息。
答:没用python处理过这么底层的东西,其实做到这么底层了,如果不打算用python现成的三方库,建议直接用c吧,你说的这些用c实现比python复杂不了多少,使用epull模型,可以很方便的实现你要的功能,甚至用c处理链接,然后把数据给python处理也行
答:select() 一般不超过 1024 个文件描述符,先天限制了不可能支持大并发。

想要支持成千上万个客户端,你是在 linux 上写的程序,这个时候,你需要 epoll 来处理 I/O 多路复用的问题,然后你再考虑用多线程或者多进程来处理你的业务逻辑。

你可以参考这个

[[翻译]python调用linux epoll编程指南 - 遗落岛]
http://www.leyle.com/archives/how_to_use_linux_epoll_with_python.html
答:这个属于设计模式的范围了。
用个全局的字典存id和Handler的对应,每个Handler里有2个队列接收一个发送一个,然后一个死循做读写。。
对某个id发送数据只需要在全局字典里面找到Handler,然后往队列里面丢就行了。
答:一台搞不定也没必要死磕嘛,入口IP上做轮询转发到后端多个服务器即可
答:感觉golang适合你的需求
答:nodejs天生就是为了你这种情况而生的。
答:上erlang
答:class DebuggingServer(SMTPServer):
# Do something with the gathered message
def process_message(self, peer, mailfrom, rcpttos, data):
inheaders = 1
lines = data.split('\n')
print '---------- MESSAGE FOLLOWS ----------'
for line in lines:
# headers first
if inheaders and not line:
print 'X-Peer:', peer[0]
inheaders = 0
print line
print '------------ END MESSAGE ------------'

指以上代码中。
答:存手工写异步的tcpserver,好麻烦的说...找到一个非阻塞的TCPServer的DEMO
https://github.com/JobsDong/SimpleServer

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » python 实现 TCPServer

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情