python-tornado-tcp服务

tornado官网文档: http://tornado-zh.readthedocs.io/zh/latest/index.html

服务端代码

#!/usr/bin/python
#coding=utf-8

from tornado.tcpserver import TCPServer
from tornado.netutil import bind_sockets
from tornado.ioloop import IOLoop
from tornado import process
from tornado.options import define, options

define("port", default=10002, help="TCP port to use")
define("server", default="127.0.0.1", help="Run as the echo server")
define("localfile", default="/home/xxx/xxx/testtcp/result.txt", help="local file")
define("encoding", default="utf-8", help="String encoding")

"""
业务逻辑类,用于处理逻辑
"""
class Connection(object):

    def __init__(self, stream, address):
        self._stream = stream
        self._address = address

        #向client端发送“101”字符,用于表示建立tcp服务成功
        self.send_message("101")
        self.read_message()

    #读取数据
    def read_message(self):
        #从流中读取client端发送过来的数据,且规定每条数据以“\n”标示结束、每条数据不得超过2048个字节
        self._stream.read_until("\n", self.broadcast_messages, 2048)

    #广播数据、处理逻辑
    def broadcast_messages(self, data):
        #如果数据不为空,则写本地文件,并向client端发送“102”字符,用于表示接收数据成功
        if data:
            self.writefile(data)
            self.send_message("102")
        self.close_stream()

    #向client端发送数据
    def send_message(self, data):
        self._stream.write(data)

    #关闭流
    def close_stream(self):
        self._stream.close()

    #捉追加写本地文件
    def writefile(self, data):
        with open(options.localfile, 'a') as local_file:
            local_file.write(data)

"""
数据服务类,继承自TCPServer
"""
class DataServer(TCPServer):
    def handle_stream(self, stream, address):
        #当连接到来时, 这个函数被调用, 传入stream(IOStream对象, 而不是原始的fd)和address, 之后就可以用IOStream对象方法收发消息了
        Connection(stream, address)

if __name__ == '__main__':
    print "Server start ......"

    #多进程模式
    sockets = bind_sockets(options.port, options.server)
    process.fork_processes(0)

    server = DataServer()
    server.add_sockets(sockets)
    IOLoop.current().start()

    # 单进程模式
    # server = DataServer()
    # server.listen(options.port, options.server)
    # IOLoop.current().start()

转载于:https://my.oschina.net/remainsu/blog/1557061

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值