网站地图 联系我们

学习python首选-实战python学习班,专注于python高级工程师培养,python课程:包括Python核心编程技术、全栈开发、网络爬虫、人工智能等。python全栈工程师+提高工作经验,获取免费试听课程!
当前位置: python培训 > python学习 > 常见问题 > 正文

Python TCPServer编程如何保存数据这块的问题

来源:肚皮舞 浏览量: 发布日期:20-08-06 13:53:51 调整字体大小【 【所属栏目:常见问题】

  我在v2ex上提了一个问题:

  用Python写了一个简单的TCPServer,放到一台Linux服务器上,目前可以从设备通过TCP连接接收十六进制消息.

  我的最终目的是使得TCPServer能够接收上万台设备发来的十六进制消息,然后解析并存到数据库里。

  当然目前仅仅需要接收几台设备的信息,但现在遇到了一些问题:

  (设备都用DTU代替,放在服务器上的脚本用DSC代替)

  1、 当多个DTU向DSC建立链接并发送数据包时,需要把当前连接保存起来,并最好有一个序号,保存到dtu_list中。当该连接断开时可以从dtu_list中根据序号删除。

  http://www.v2ex.com/t/154857#reply25

  下面也有人回答了,我用这个项目的源码已经实现了部分功能,包括服务器的建立,还能保存数据,但我是直接用pymysql直接在process_message保存的。

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

  但是还是有问题需要解决:

  1、虽然可以建立服务器,比如使用下面的代码

  pythonfrom gevent import monkey

  monkey.patch_all()

  from gsmtpd.server import SMTPServer

  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

  # 我在这儿直接保存line到数据库,使用的pymysql

  print '------------ END MESSAGE ------------'

  if __name__ == "__main__":

  server = DebuggingServer()

  server.serve_forever()

  # 以下的代码是无法执行的

  1、但是server.serve_forever()下的代码是无法执行的,服务器建立了(bind),还是需要一些操作的,比如我需要服务器主动发送一些数据到客户端去操作一些指令,那应该如何组织代码呢?

  (可以这样了解在linux下执行server.py,转入后台运行,然后我还想主动操作server,我再执行server.py option value 时,是另执行一个进程,如何解决呢?)

  2、每次客户端发起的连接我都需要保存起来,因为服务器主动发送数据时,一定需要根据客户端的id有选择的回复。这个如何操作?

  关于如何保存数据这块,如果有人知道就更好了,但这个问题是其次的,上面的两个问题很重要。我想参考一些代码,看有没有这方面的例子,如果有人能提供更好了,我上网查了不少代码,关于这方面的还是不多。而且大多数就建立一个测试的例子,和我这儿的需求不太一样。

  建议去看 shadowsocks 的 python 源码.

  不太了解gevent,但是Twisted Socket Server的做法是使用Factory,需要持久化的放在Factory,这样所有的DeviceID, SNR都可以查得到。尤其使用Long pull TCP connections的话,直接发给对方就好了。

  不过既然分为Client/Server模式,那么Server就应该听为主,尽量不要自己去Push,让Client来Pull就好了。

  不过Twisted比较难调试。Tornado也是如此。如果涉及到SQL DB和NoSQL DB操作,需要仔细编写代码。

  不过我现在完成了基本的框架,下一步准备加上CoAP和TLS。其中CoAP也可以解决Push的需求。

标签:
肚皮舞新闻动态News Center

肚皮舞视频

肚皮舞培训课程

联系卡伊丝contact us
联系我们
python培训「零基础入门到精通」python人工智能编程培训班-0798wz.com

咨询热线:18301225663