tornado学习 - TCPServer 实现聊天功能
最近学习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 mint
,nc
命令可以访问给定的地址和端口,所以只需要:
nc localhost 8888
就能访问到服务器。
对目前自己的相关知识还是缺乏信心,有些理解可能略有偏差,欢迎指正。
tornado学习 - TCPServer 实现聊天功能的更多相关文章
- tornado学习 - TCPClient 实现聊天功能
之前完成了一个简单的聊天服务器,连接服务器使用的是系统自带nc命令,接下来就是通过自己实现TCPClient. 客户端与服务器功能大致相仿,相对与服务器只是少了转发消息环节. 首先,定义TCPClie ...
- Spring 学习——基于Spring WebSocket 和STOMP实现简单的聊天功能
本篇主要讲解如何使用Spring websocket 和STOMP搭建一个简单的聊天功能项目,里面使用到的技术,如websocket和STOMP等会简单介绍,不会太深,如果对相关介绍不是很了解的,请自 ...
- 我们一起学习WCF 第九篇聊天功能
说到聊天,那么其实就是传输数据,把自己写的东西传给自己想发送的那么人.我总结一下传输常见的有三种方式 1:就是我们常见的数据库传输 2:就是文件(流)传输 3:就是socket传输 今天我们说的wcf ...
- Linux下p2p的聊天功能实现
Linux下p2p的聊天功能实现细节 Do one thing at a time, and do well. 今天闲着没事,写一个P2P的点对点的聊天功能的小程序,我觉得对网络编程初学者的学习很有用 ...
- MingQQ v1.0高仿版开源了,使用WebQQ协议实现了QQ客户端基本的聊天功能...
MingQQ v1.0高仿版开源了,使用WebQQ协议实现了QQ客户端基本的聊天功能... MingQQ目前支持的功能如下:1.支持普通方式登录.验证码方式登录.注销.保持在线.改变在线状态.2.支持 ...
- Redis实现聊天功能
在学习了Redis做为消息队列之后研究 了redis聊天的功能. 其实用关系型数据库也可以实现消息功能,自己就曾经用mysql写过一个简单的消息的功能.RDB中思路如下: ** 在实际中可以完全借助m ...
- 采用tcp协议和UDP协议实现简单的聊天功能
Date: 2019-06-19 Author: Sun 一. Python3输出带颜色字体 实现过程: 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关. 转义 ...
- [Asp.net 开发系列之SignalR篇]专题二:使用SignalR实现酷炫端对端聊天功能
一.引言 在前一篇文章已经详细介绍了SignalR了,并且简单介绍它在Asp.net MVC 和WPF中的应用.在上篇博文介绍的都是群发消息的实现,然而,对于SignalR是为了实时聊天而生的,自然少 ...
- tornado 学习笔记1 引言
从事软件开发这行业也快5年啦,其实从事的工作也不完全是软件开发,软件开发只是我工作中的一部分.其中包括课题研究.信息化方案设计.软件开发.信息系统监理.项目管理等工作,比较杂乱.开发的软件比较多,但是 ...
随机推荐
- Yii实现Password Repeat Validate Rule
在使用Yii时遇到这样的需求:在一个注册的页面输入两次密码,并验证两次输入是否一致.可是password的repeat的字段在数据库 并不存在.问题来了,如何创建一个password_repeat的属 ...
- 安卓 SQLite error:SQLite database locked exception while compling : PRAGMA journal_mode .....
项目中频繁的切换Tab键,会频繁地从数据库读取数据,这是报出这样的错误: 解决方法是在国外的某论坛找到的 : 在插入数据的时候,首先: SQLiteDatabase db = SQLiteDataba ...
- 2782: [HNOI2006]最短母串
2782: [HNOI2006]最短母串 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3 Solved: 2[Submit][Status][Web ...
- ArcGisServer根据最大最小坐标换算瓦片行列号(转载)
ArcGisServer根据最大最小坐标换算瓦片行列号 1.前言 在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或经纬度)的换算方法,而知道这个原理后,接下来我们要怎么用它呢?它和我们前端 ...
- C#子窗口与父窗口交互(使用委托和事件)
目标:在子窗口Form2上单击按钮时向Form1传递一组自定义参数,并显示在父窗口Form1上. 方法:有很多方法,这里只介绍委托和事件的实现方式. 思路:Form2中定义事件,Form1创建Form ...
- php分页原理教程及简单实例
<?php //连接数据库 $con = mysql_connect("localhost","root",""); mysql_se ...
- Selenium2(java)页面对象模型(Page Object) 八
在开发一个 Selenium WebDriver 测试,我们可以使用页面对象模型.这个模型可以使测 试脚本有更高的可维护性,减少了重复的代码,把页面抽象出来.对象模型也提供了一个注释,帮助缓存远程,避 ...
- doubango(6)--Doubango协议栈中对RTP的管理
相关数据结构 1. tsip_dialog_invite_t 描述: 一个invite_dialog代表了一个invite期间的所有的信令流程,因此,它首先是一个普遍的dialog的特殊化结构, ...
- 搭建Node.js开发IDE环境WebStrom5 多图
1.下载前期准备 node.js下载地址 http://nodejs.org/ WebStrom5下载地址: http://download-ln.jetbrains.com/webide/WebSt ...
- ORACLE的Dead Connection Detection浅析
在复杂的应用环境下,我们经常会遇到一些非常复杂并且有意思的问题,例如,我们会遇到网络异常(网络掉包.无线网络断线).客户端程序异常(例如应用程序崩溃Crash).操作系统蓝屏.客户端电脑掉电.死机重启 ...