tornado学习 - TCPClient 实现聊天功能
之前完成了一个简单的聊天服务器,连接服务器使用的是系统自带nc命令,接下来就是通过自己实现TCPClient.
客户端与服务器功能大致相仿,相对与服务器只是少了转发消息环节。
首先,定义TCPClient类,主要初始化host、port、stream属性。
class SimpleTCPClient:
def __init__(self, host, port):
self._host = host
self._port = port
self._stream = None
self.EOF = b' end'
刚创建client实例时还未与服务器连接,所以_stream初始值为None。EOF设置为消息的结尾,当读到这个标识时表示一条消息输出完毕。
def get_stream(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
self._stream = tornado.iostream.IOStream(sock)
self._stream.set_close_callback(self.on_close)
获取socket,通过tornado.iostream.IOStream创建_stream。
socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)中,其中第一个参数是namespace即使用的地址,这里的AF_INET表示使用IPv4地址,第二个参数是style,即socket的连接类型,这里使用的SOCK_STREAM是流式类型基于TCP。第三个参数是protocol指使用的协议类型,一般情况下使用0表示系统根据情况决定。
def connect(self):
self.get_stream()
self._stream.connect((self._host, self._port), self.start)
定义连接服务器的方法,先获取_stream然后连接服务器地址和指定端口,最后注册回调函数就是开始客户端运行的函数。
def start(self):
t1 = threading.Thread(target = self.read_msg)
t2 = threading.Thread(target = self.send_msg)
t1.daemon, t2.daemon = True, True
t1.start()
t2.start()
使用多线程同时通知收发消息。这里存在一个问题,使用多线程时,如果退出程序就必须要结束线程,否则会抛出异常,但是程序何时结束取决于用户。为了解决这个问题,将线程设置为daemon线程,daemon线程可以在主程序结束时自动结束。
def read_msg(self):
self._stream.read_until(self.EOF, self.show_msg)
def show_msg(self, data):
print(to_unicode(data))
self.read_msg()
接受并显示消息。当数据中读取到结束标识,调用打印消息的方法,消息打印完毕后再调用读取方法,以此保持接收消息的状态。
def send_msg(self):
while True:
data = input()
self._stream.write(bytes(data) + self.EOF)
发送消息。使用while循环保持输入状态,当输入完成讲消息转换为byte型,与消息结束标识拼接之后发送。
def on_close(self):
print('exit ...')
quit()
用户退出时关闭_stream会激活这个函数。
if __name__ == '__main__':
try:
client = SimpleTCPClient('localhost', 8888)
client.connect()
tornado.ioloop.IOLoop.instance().start()
到这里TCPClient基本完成。
之前绞尽脑汁不知道该如何解决同时保持收发信息的状态,也有想过通过多线程的方式,但是转念一想tornado时单线程的,担心会有问题,然后就一直在纠结。
其实,编程不应该怕报错或者崩溃,遇到问题解决问题这是提高自己的途径,不应该对未知的感到担心或害怕,多尝试,大不了从头写过!
tornado学习 - TCPClient 实现聊天功能的更多相关文章
- tornado学习 - TCPServer 实现聊天功能
最近学习tornado框架,其中有很多值得学习的模块,鉴于某位学长的建议,也决定好好看看tornado.tcpserver. 关于TCP协议详细介绍可查阅wiki. 对于TCP服务器,基本的操作tor ...
- 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 ...
- Tornado学习
为什么用Tornado? 异步编程原理 服务器同时要对许多客户端提供服务,他的性能至关重要.而服务器端的处理流程,只要遇到了I/O操作,往往需要长时间的等待. 屏幕快照 2018-10-31 上午 ...
- 采用tcp协议和UDP协议实现简单的聊天功能
Date: 2019-06-19 Author: Sun 一. Python3输出带颜色字体 实现过程: 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关. 转义 ...
- [Asp.net 开发系列之SignalR篇]专题二:使用SignalR实现酷炫端对端聊天功能
一.引言 在前一篇文章已经详细介绍了SignalR了,并且简单介绍它在Asp.net MVC 和WPF中的应用.在上篇博文介绍的都是群发消息的实现,然而,对于SignalR是为了实时聊天而生的,自然少 ...
随机推荐
- Unity3D ——强大的跨平台3D游戏开发工具(四)
第六章 Unity3D中的C#Script编程的注意事项 也许您在学习Unity3D之前,已经是一位C#的编程高手了.但在Unity3D中的C#并不像真正的C#那般强大,在Unity3D的C#中必须全 ...
- 分析java堆
内存溢出(OutOfMemory) OOM 堆溢出 直接内存溢出 永久区溢出
- Python3基础 add() 向集合中加入新的元素
镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...
- 【转】sql语句的优化分析
开门见山,问题所在 sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种情况. 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应的索 ...
- dp中表示无限取的写法
dp[i][j]=dp[i-a[i][j]+dp[i-a[i]][j-1]; 其中前一项j不变表示j这一项无限取
- js原生设计模式——9外观模式封装2(小型代码库YJ)
<script type="text/javascript"> //小型代码库YJ封装 var YJ = { //根据id获取元素 ...
- CRS-2800 CRS-4000
I was installing Clusterware using ASM on VMware shared disks. When I created the independent persi ...
- 浅析vue数据绑定
前言:最近团队需要做一个分享,脚进脑子,不知如何分享.最后想着之前一直想研究一下 vue 源码,今天刚好 "借此机会" 研究一下. 网上研究vue数据绑定的文章已经非常多了,但是自 ...
- 开箱即用 - Grunt合并和压缩 js,css 文件
js,css 文件合并与压缩 Grunt 是前端自动化构建工具,类似webpack. 它究竟有多强悍,请看它的 介绍. 这里只演示如何用它的皮毛功能:文件合并与压缩. 首先说下js,css 合并与压缩 ...
- 简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行
[TOC] 简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行 程序源码 import java.io.IOException; import java.util. ...