废话不多说,直接上代码

程序组成

数据访问层: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实现异步多线程服务端简单聊天功能相关推荐

  1. 《Linux多线程服务端编程:使用muduoC++网络库》学习笔记

    文章目录 第1章 线程安全的对象生命期管理 1.1 当析构函数遇到多线程 1.1.1 线程安全的定义 1.1.3 线程安全实例 1.2 对象的创建很简单 1.3 销毁很难 1.4 线程安全的Obser ...

  2. 《Linux多线程服务端编程:使用muduo C++网络库》书摘6.6.2节

    6.6.2 常见的并发网络服务程序设计方案 W. Richard Stevens 的<UNIX 网络编程(第2 版)>第27 章"Client-ServerDesign Alte ...

  3. linux c++ 线程支持 多核应用,linux C++多线程服务端开发

    linux C++多线程服务端开发 UNIX 线程安全的对象生命期管理 当析构函数遇到多线程 构造不要在构造函数中注册任何回调 不要在构造函数中把this传给跨线程的对象 即便在构造函数的最后一行也不 ...

  4. 指纹系统服务器,利用JARM指纹进行TLS服务端标记

    原标题:利用JARM指纹进行TLS服务端标记 0x01 背景 对网络空间测绘数据的分析和发掘,是Quake团队一直以来的核心目标. 十几年来Web应用的飞速发展使其毋庸置疑的成为了互联网的主流.为了弥 ...

  5. 新书预告:《Linux 多线程服务端编程——使用 muduo C++ 网络库》

    看完了 W. Richard Stevens 的传世经典<UNIX 网络编程>, 能照着例子用 Sockets API 编写 echo 服务, 却仍然对稍微复杂一点的网络编程任务感到无从下 ...

  6. 多线程服务端和客户端通信

    ❤️强烈推荐人工智能学习网站❤️ 在不同的机器上可以用TCP进行通信,在同一台机器上也可以,用客户端/服务端模式通信耦合度更低,golang示例多线程服务端和客户端通信,用C++写也可以 packag ...

  7. MSDN上的异步socket 服务端例子

    MSDN上的异步socket 服务端例子 2006-11-22 17:12:01|  分类: 代码学习 |  标签: |字号大中小 订阅 Imports System Imports System.N ...

  8. Linux多线程服务端编程学习(四)finger服务的实现

    源码下载以及安装点击链接https://blog.csdn.net/YoungSusie/article/details/90021742 分类 Muduo网络库编程 学习笔记 例 七步实现finge ...

  9. Euraka服务端简单配置

    Euraka服务端简单配置 注册中心,主要用来微服务调用 父工程pom依赖 <?xml version="1.0" encoding="UTF-8"?&g ...

最新文章

  1. L1-016 查验身份证(2016年天梯赛模拟赛第8题)
  2. Windows 7键盘失灵导致无法输入登录密码问题解决方案
  3. mysql5.7.1.9二进制安装_mysql 5.7.9 linux二进制安装
  4. iOS 分类添加属性
  5. GitHub之深入解析脚本·自定义与修改GitHub来更好地为特定的工作流程工作
  6. 常用AT指令集 (转)
  7. Kickstart之添加自动化脚本
  8. mysql5.1安装失败_解决MySQL5.1安装时出现Cannot create windows service for mysql.error:0
  9. 滚动后mouseleave失效_滚动直线导轨副用钳制器可靠性试验设计
  10. HibernateEHCache –Hibernate二级缓存
  11. 前++和后++引发的血案
  12. Macaca自动化测试Android和IOS应用
  13. Cadence工具系列介绍
  14. 【每日一具9】Gif动画录制工具
  15. 人口普查数据有疑问???
  16. BootStrap之导航navigation
  17. Win10系统如何关闭防火墙?
  18. Python自学指南-你好啊!Python
  19. 魂动罗java源码_魂斗罗源码(VC版)
  20. [Linux Kernel] memory-barriers 内存屏蔽 官方文档

热门文章

  1. vb调用vc dll
  2. [CVPR2016]Learning Deep Feature Representations with Domain Guided Dropout for Person Re-id
  3. Thinkpad系统重装终极版
  4. 索引语法——创建索引 || 查看索引 || 删除索引 || ALTER命令 索引设计原则
  5. Response对象||案例:重定向||forward 转发 和  redirect 重定向的 区别||路径写法
  6. 实验18:使用@Autowired注解实现根据类型实现自动装配★
  7. 机器人视觉——使用numpy进行像素的处理 || 获取图像的属性 || 感兴趣区域ROI || 通道的拆分与合并
  8. Python 技术篇-通过进程名称、PID杀死windows进程的两种方法,获取当前运行程序的pid
  9. JavaScript 技术篇-js获取dom节点、html标签自定义属性的值。
  10. Python 技巧篇-如何避免python报错导致强制关闭窗口