最近学习tornado框架,其中有很多值得学习的模块,鉴于某位学长的建议,也决定好好看看tornado.tcpserver

关于TCP协议详细介绍可查阅wiki

对于TCP服务器,基本的操作tornado.tcpserver.TCPServer已经封装好,只需要重写handle_stream()方法即可。

目前只写了一个简单的聊天服务器。其中需要的功能基本功能就是客户端连接服务器之后发出消息,服务器将该消息推送到目前在服务器上连接的每一个客户端。

class Connection:
clients = set()
def __init__(self, stream, address):
self._stream = stream
self._address = address self.EOF = b'\n' self._stream.set_close_callback(self.on_close)
self.read_message()
print('{} has entered the room.'.format(address))

声明一个空集合clients用来存储所有连接到服务器的客户端对象。_stream可以抽象成一座架在客户端与服务器间的桥梁,在其上进行数据传输等操作。_address则是客户端地址和端口,是一个元组对象。EOF用来作为客户端发送消息完毕的标识。ser_close_callback()注册一个回调函数,在stream关闭时会被激活。read_message()时该连接类的核心方法,负责读取客户端发送信息。

    def read_message(self):
self._stream.read_until(self.EOF, boardcast_message)

负责从缓冲区读取数据,当遇到EOF时,读取完成并且激活回调函数。

    def boardcast_message(self, data):
try:
data = tornado.escape.to_unicode(data)
for conn in Connection.clients:
conn.send_message(data)
self.read_message()
except StreamClosedError as e:
pass

将客户端发送消息广播到每个连接在服务器的客户端。其中遍历Connection.clients保持监听每一个客户端发送信息。处理异常pass断开stream时的报错。

    def send_message(self, data):
data = str(self._address) + ' said: ' + data
self._stream.write(bytes(data.encode('utf-8')))

客户端发送消息,将数据转换为bytes类型,通过stream.write()写入缓冲区。

    def on_close(self):
Connection.clients.remove(self)

当客户端断开连接时,将其从保存的客户端集合中删除。

到这里,服务器端的连接类基本成型。接下来就是TCP服务器,只要继承tornado.tcpserver.TCPServer类,然后重写handle_stream()方法就行。

class SimpleTCPServer(tornado.tcpserver.TCPServer):
def handle_stream(self, stream, address):
Connection(stream, address)

接下来就是让服务器运行.

if __name__ == '__main__':
server = SimpleTCPServer()
server.listen(8888, '0.0.0.0')
tornado.ioloop.IOLoop.instance().start()

创建一个服务器实例,然后监听8888端口,所有ip。之后运行一个ioloop实例并且start()即可。

测试效果结果的话,因为我是使用Linux mintnc命令可以访问给定的地址和端口,所以只需要:

nc localhost 8888就能访问到服务器。

对目前自己的相关知识还是缺乏信心,有些理解可能略有偏差,欢迎指正。

tornado学习 - TCPServer 实现聊天功能的更多相关文章

  1. tornado学习 - TCPClient 实现聊天功能

    之前完成了一个简单的聊天服务器,连接服务器使用的是系统自带nc命令,接下来就是通过自己实现TCPClient. 客户端与服务器功能大致相仿,相对与服务器只是少了转发消息环节. 首先,定义TCPClie ...

  2. Spring 学习——基于Spring WebSocket 和STOMP实现简单的聊天功能

    本篇主要讲解如何使用Spring websocket 和STOMP搭建一个简单的聊天功能项目,里面使用到的技术,如websocket和STOMP等会简单介绍,不会太深,如果对相关介绍不是很了解的,请自 ...

  3. 我们一起学习WCF 第九篇聊天功能

    说到聊天,那么其实就是传输数据,把自己写的东西传给自己想发送的那么人.我总结一下传输常见的有三种方式 1:就是我们常见的数据库传输 2:就是文件(流)传输 3:就是socket传输 今天我们说的wcf ...

  4. Linux下p2p的聊天功能实现

    Linux下p2p的聊天功能实现细节 Do one thing at a time, and do well. 今天闲着没事,写一个P2P的点对点的聊天功能的小程序,我觉得对网络编程初学者的学习很有用 ...

  5. MingQQ v1.0高仿版开源了,使用WebQQ协议实现了QQ客户端基本的聊天功能...

    MingQQ v1.0高仿版开源了,使用WebQQ协议实现了QQ客户端基本的聊天功能... MingQQ目前支持的功能如下:1.支持普通方式登录.验证码方式登录.注销.保持在线.改变在线状态.2.支持 ...

  6. Redis实现聊天功能

    在学习了Redis做为消息队列之后研究 了redis聊天的功能. 其实用关系型数据库也可以实现消息功能,自己就曾经用mysql写过一个简单的消息的功能.RDB中思路如下: ** 在实际中可以完全借助m ...

  7. 采用tcp协议和UDP协议实现简单的聊天功能

    Date: 2019-06-19 Author: Sun 一. Python3输出带颜色字体 实现过程: ​ 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关. ​ 转义 ...

  8. [Asp.net 开发系列之SignalR篇]专题二:使用SignalR实现酷炫端对端聊天功能

    一.引言 在前一篇文章已经详细介绍了SignalR了,并且简单介绍它在Asp.net MVC 和WPF中的应用.在上篇博文介绍的都是群发消息的实现,然而,对于SignalR是为了实时聊天而生的,自然少 ...

  9. tornado 学习笔记1 引言

    从事软件开发这行业也快5年啦,其实从事的工作也不完全是软件开发,软件开发只是我工作中的一部分.其中包括课题研究.信息化方案设计.软件开发.信息系统监理.项目管理等工作,比较杂乱.开发的软件比较多,但是 ...

随机推荐

  1. C语言-if语句

    1.一般形式 if(表达式)表达式1 else 表达式2   :表达式成立(为真)则执行表达式1,否则执行表达式2. 适用范围:真假,对错,开关,对立面的条件 注意:如果if语句中只包括一条语句,可以 ...

  2. UVa 10667 - Largest Block

    题目大意:这个也是和UVa 836 - Largest Submatrix差不多,修改一下数据就可以套用代码的. #include <cstdio> #include <cstrin ...

  3. java系列--EL和JSTL

    一.EL表达式语言 构成:${变量} 功能:可以从范围对象直接取值 默认为requestScope 如果访问的属性不存在,EL返回值为null,但在JSP页面中显示空字符串不显示 EL表达式可以出现的 ...

  4. NPM 简单实用说明

    https://nodejs.org/en/download/ 下载并按照,直接下一步就可以,最后会在C:\Program Files 新建一个nodejs文件夹,里面有一个node.exe.双击就启 ...

  5. 二叉树最大路径和-Binary Tree Maximum Path Sum

    Given a binary tree, find the maximum path sum. For this problem, a path is defined as any sequence ...

  6. Antx简介(ali_PPT)

    Antx的由来: §最早,我们用Makefile来build系统 •Makefile不适合Java的编译 §后来,我们用Ant来build系统 •开始时很不错 •随着项目增多,出现困难 §利用bean ...

  7. 建立、配置和使用Activity——Activity

    Activity是Android应用中最重要.最常见的应用组件(此处的组件是粗粒度的系统组成部分,并非指界面控件:widget).Android应用的一个重要组成部分就是开发Activity,下 面将 ...

  8. CSS 简介、语法、派生选择器、id 选择器、类选择器、属性选择器

    CSS 概述 CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中,是为了解决内容与表现 ...

  9. SQL server 定时自动执行SQL存储过程

    当一个存储过程是为了生成报表,并且是周期性的,则不需要人工干预,由SQL作业定时自动执行些SQL存储过程即可. 本示例,假设已需要定时执行的存储过程为:Pr_test 工具/原料 SQL Server ...

  10. 算法一之N皇后问题

    (写这篇文章主要是明天就要考试了,算法考试,今天不想再复习了,xiang着今天也开通了博客,于是在这个平台上进行复习,应该会更高效.最后祝愿我明天考个好成绩.嘻嘻...) n皇后问题,主要是应用到回溯 ...