利用socketserver实现异步多线程服务端简单聊天功能
废话不多说,直接上代码
程序组成
数据访问层:model-------chat_log.py(用于保存聊天记录及展示)
---user_info.py(用户登录信息表,验证通过才能聊天)
公共功能层:utility-------sqlhelper.py(用于处理查询及插入数据的操作)
---conf.py(用于保存数据库连接字符串)
主程序:server.py--------Socket服务端
client.py----------Socket客户端
server.py
1 #!/usr/bin/env python 2 #_*_ coding:utf-8 _*_ 3 import SocketServer 4 import json 5 import time 6 from model.userinfo import UserInfo 7 from model.chat_log import ChatLog 8 9 class MyServer(SocketServer.BaseRequestHandler): 10 11 def setup(self): 12 pass 13 14 def handle(self): 15 container = {'key':'','data':''} 16 container['data'] = 'ok...' 17 conn = self.request 18 conn.sendall(json.dumps(container)) 19 20 Flag =True 21 while Flag: 22 try: 23 datetime = time.strftime('%Y-%m-%d %H:%M:%S') 24 data = conn.recv(1024) 25 print data 26 recv_data = json.loads(data) 27 if recv_data['data'] == 'exit': 28 conn.close() 29 break 30 #key为空,表示用户没有登录或登录失败 31 if not recv_data['key']: 32 name,pwd = recv_data['data'] 33 re = UserInfo().ChechkLogin(name, pwd) 34 #re = 1 35 if re: 36 recv_data['key'] = re 37 recv_data['data'] = '约吗' 38 else: 39 recv_data['data'] = 'failed' 40 conn.sendall(json.dumps(recv_data)) 41 #用户已经登陆 42 else: 43 if recv_data['data'] == 'list': 44 ChatLog().ShowLog() 45 elif recv_data['data'].__contains__('yes'): 46 ChatLog().SaveLog(recv_data['data'], datetime) 47 recv_data['data'] = 'i am gay!' 48 ChatLog().SaveLog(recv_data['data'], datetime) 49 else: 50 ChatLog().SaveLog(recv_data['data'], datetime) 51 recv_data['data'] = 'what?' 52 ChatLog().SaveLog(recv_data['data'], datetime) 53 conn.sendall(json.dumps(recv_data)) 54 except Exception,e: 55 print e 56 Flag = False 57 58 def finish(self): 59 pass 60 61 if __name__ == '__main__': 62 server = SocketServer.ThreadingTCPServer(('127.0.0.1',9999),MyServer) 63 server.serve_forever()
View Code
client.py
1 #!/usr/bin/env python 2 #_*_ coding:utf-8 _*_ 3 import socket 4 import json 5 6 #创建客户端socket对象 7 client = socket.socket() 8 ip_port = ('127.0.0.1',9999) 9 #客户端连接服务端 10 client.connect(ip_port) 11 #客户端接收数据 12 while True: 13 data = client.recv(1024) 14 #print data 15 client_recv_data = json.loads(data) 16 print client_recv_data['data'] 17 if not client_recv_data['key']: 18 name = raw_input('username:') 19 pwd = raw_input('pasword:') 20 client_recv_data['data'] = (name,pwd) 21 client.send(json.dumps(client_recv_data)) 22 else: 23 inp = raw_input('client:') 24 client_recv_data['data'] = inp 25 client.send(json.dumps(client_recv_data)) 26 if inp == 'exit': 27 break
View Code
sqlhelper.py
1 #!/usr/bin/env python 2 #_*_ coding:utf-8 _*_ 3 import MySQLdb 4 import conf 5 6 class MysqlHelper(object): 7 def __init__(self): 8 self.__conn_dict = conf.conn_dict 9 10 def GetDict(self,sql,params): 11 conn = MySQLdb.connect(**self.__conn_dict) 12 cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor) 13 14 #cur = conn.cursor() 15 reCount = cur.execute(sql,params) 16 nRet = cur.fetchall() 17 18 cur.close() 19 conn.close() 20 return nRet 21 def GetOne(self,sql,params): 22 conn = MySQLdb.connect(**self.__conn_dict) 23 cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor) 24 25 #cur = conn.cursor() 26 reCount = cur.execute(sql,params) 27 nRet = cur.fetchone() 28 29 cur.close() 30 conn.close() 31 return nRet 32 33 def InsertOne(self,sql,params): 34 conn = MySQLdb.connect(**self.__conn_dict) 35 cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor) 36 37 reCount = cur.execute(sql,params) 38 conn.commit() 39 40 cur.close() 41 conn.close()
View Code
conf.py
1 #!/usr/bin/env python 2 #_*_ coding:utf-8 _*_ 3 conn_dict = dict(host='127.0.0.1',user='root',passwd='123456',db='08day05')
chat_log.py
1 #!/usr/bin/env python 2 #_*_ coding:utf-8 _*_ 3 from utility.sqlhelper import MysqlHelper 4 class ChatLog(): 5 def __init__(self): 6 self.__helper = MysqlHelper() 7 def SaveLog(self,msg,insert_day): 8 sql = 'insert into chat_log(msg,time) values(%s,%s)' 9 params = (msg,insert_day) 10 self.__helper.InsertOne(sql, params) 11 def ShowLog(self): 12 sql = 'select * from chat_log' 13 params = () 14 result = str(self.__helper.GetDict(sql,params)) 15 return result 16 #print result 17 ''' 18 for msg_dict in result: 19 for item in msg_dict: 20 print item+':'+str(msg_dict[item]) 21 ''' 22 23 #log1 = ChatLog() 24 #log1.ShowLog()
userinfo.py
1 #!/usr/bin/env python 2 #_*_ coding:utf-8 _*_ 3 from utility.sqlhelper import MysqlHelper 4 5 class UserInfo(object): 6 def __init__(self): 7 self.__helper = MysqlHelper() 8 9 def ChechkLogin(self,username,password): 10 sql = 'select id from userinfo where name = %s and password = %s' 11 params = (username,password) 12 result = self.__helper.GetOne(sql, params) 13 if result: 14 return result 15 else: 16 return False 17
转载于:https://www.cnblogs.com/songbq/p/5070612.html
利用socketserver实现异步多线程服务端简单聊天功能相关推荐
- 《Linux多线程服务端编程:使用muduoC++网络库》学习笔记
文章目录 第1章 线程安全的对象生命期管理 1.1 当析构函数遇到多线程 1.1.1 线程安全的定义 1.1.3 线程安全实例 1.2 对象的创建很简单 1.3 销毁很难 1.4 线程安全的Obser ...
- 《Linux多线程服务端编程:使用muduo C++网络库》书摘6.6.2节
6.6.2 常见的并发网络服务程序设计方案 W. Richard Stevens 的<UNIX 网络编程(第2 版)>第27 章"Client-ServerDesign Alte ...
- linux c++ 线程支持 多核应用,linux C++多线程服务端开发
linux C++多线程服务端开发 UNIX 线程安全的对象生命期管理 当析构函数遇到多线程 构造不要在构造函数中注册任何回调 不要在构造函数中把this传给跨线程的对象 即便在构造函数的最后一行也不 ...
- 指纹系统服务器,利用JARM指纹进行TLS服务端标记
原标题:利用JARM指纹进行TLS服务端标记 0x01 背景 对网络空间测绘数据的分析和发掘,是Quake团队一直以来的核心目标. 十几年来Web应用的飞速发展使其毋庸置疑的成为了互联网的主流.为了弥 ...
- 新书预告:《Linux 多线程服务端编程——使用 muduo C++ 网络库》
看完了 W. Richard Stevens 的传世经典<UNIX 网络编程>, 能照着例子用 Sockets API 编写 echo 服务, 却仍然对稍微复杂一点的网络编程任务感到无从下 ...
- 多线程服务端和客户端通信
❤️强烈推荐人工智能学习网站❤️ 在不同的机器上可以用TCP进行通信,在同一台机器上也可以,用客户端/服务端模式通信耦合度更低,golang示例多线程服务端和客户端通信,用C++写也可以 packag ...
- MSDN上的异步socket 服务端例子
MSDN上的异步socket 服务端例子 2006-11-22 17:12:01| 分类: 代码学习 | 标签: |字号大中小 订阅 Imports System Imports System.N ...
- Linux多线程服务端编程学习(四)finger服务的实现
源码下载以及安装点击链接https://blog.csdn.net/YoungSusie/article/details/90021742 分类 Muduo网络库编程 学习笔记 例 七步实现finge ...
- Euraka服务端简单配置
Euraka服务端简单配置 注册中心,主要用来微服务调用 父工程pom依赖 <?xml version="1.0" encoding="UTF-8"?&g ...
最新文章
- L1-016 查验身份证(2016年天梯赛模拟赛第8题)
- Windows 7键盘失灵导致无法输入登录密码问题解决方案
- mysql5.7.1.9二进制安装_mysql 5.7.9 linux二进制安装
- iOS 分类添加属性
- GitHub之深入解析脚本·自定义与修改GitHub来更好地为特定的工作流程工作
- 常用AT指令集 (转)
- Kickstart之添加自动化脚本
- mysql5.1安装失败_解决MySQL5.1安装时出现Cannot create windows service for mysql.error:0
- 滚动后mouseleave失效_滚动直线导轨副用钳制器可靠性试验设计
- HibernateEHCache –Hibernate二级缓存
- 前++和后++引发的血案
- Macaca自动化测试Android和IOS应用
- Cadence工具系列介绍
- 【每日一具9】Gif动画录制工具
- 人口普查数据有疑问???
- BootStrap之导航navigation
- Win10系统如何关闭防火墙?
- Python自学指南-你好啊!Python
- 魂动罗java源码_魂斗罗源码(VC版)
- [Linux Kernel] memory-barriers 内存屏蔽 官方文档
热门文章
- vb调用vc dll
- [CVPR2016]Learning Deep Feature Representations with Domain Guided Dropout for Person Re-id
- Thinkpad系统重装终极版
- 索引语法——创建索引 || 查看索引 || 删除索引 || ALTER命令 索引设计原则
- Response对象||案例:重定向||forward 转发 和 redirect 重定向的 区别||路径写法
- 实验18:使用@Autowired注解实现根据类型实现自动装配★
- 机器人视觉——使用numpy进行像素的处理 || 获取图像的属性 || 感兴趣区域ROI || 通道的拆分与合并
- Python 技术篇-通过进程名称、PID杀死windows进程的两种方法,获取当前运行程序的pid
- JavaScript 技术篇-js获取dom节点、html标签自定义属性的值。
- Python 技巧篇-如何避免python报错导致强制关闭窗口