Python TCPServer 编程遇到的问题


我在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、虽然可以建立服务器,比如使用下面的代码


 python


 from 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有选择的回复。这个如何操作?

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

python socketserver

你回家养猪罢 11 years, 6 months ago

建议去看 shadowsocks 的 python 源码.

  1. eventLoop.py 就能让你高并发. (简单封装了 select ,linux 下用的是 epoll , 比学习 gevent 轻松)

  2. LRUCache.py 其实就是你要的服务端缓存客户端链接,返回消息. shadowsocks 也有一样的需求,也是这么做的.

  3. server.py option value 再操作是要新开一个还是操作原来的? 感觉楼主是要操作原来的,只要你能监控标准输入就可以了, server.py 就不用了, 直接 option value . 只要你会做 cli 交互的 Python 程序,那么,不论是 eventLoop.py 还是 gevent 结合非阻塞输入就都可以实现.

无知的围观群总 answered 11 years, 6 months ago

Your Answer