利用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()

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

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()

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         
时间: 2024-08-15 21:32:34

利用socketserver实现异步多线程服务端简单聊天功能的相关文章

python socket编程之客户端和服务端简单交互

服务端 #_*_ coding:utf-8 _*_ #导入socket模块 import socket # 创建socket对象 sk = socket.socket() #绑定侦听的IP和端口号 ip_port = ('192.168.9.213',9999) sk.bind(ip_port) #最大连接数 sk.listen(5) #接受请求,接受请求的时候可以获取到客户端的socket对象,以及客户端的IP和端口 #通过while循环,让服务端一直接受客户端请求 print "正在等待客户

socket编程,简单多线程服务端测试程序

socket编程,简单多线程服务端测试程序 前些天重温了MSDN关于socket编程的WSAStartup.WSACleanup.socket.closesocket.bind.listen.accept.recv.send等函数的介绍,今天写了一个CUI界面的测试程序(依赖MFC)作为补充.程序功能简介如下: 1:一个线程做监听用. 2:监听线程收到客户端连接后,创建新线程接收客户端数据.所有对客户端线程将加入容器,以便管理. 3:服务端打印所有客户端发来的信息. 4:服务端CUI界面输入数字

winform客户端利用webClient实现与Web服务端的数据传输

由于项目需要,最近研究了下WebClient的数据传输.关于WebClient介绍网上有很多详细介绍,大概就是利用WebClient可以实现对Internet资源的访问.无外乎客户端发送请求,服务端处理请求.回应请求.所以,我下面就简单描述下学习过程中遇到的一些问题: 1.关于Winform客户端请求 WebClient wc = new WebClient();//初始化webclient string path = "http://192.168.1.115:8089/Handler1.as

.net平台 基于 XMPP协议的即时消息服务端简单实现

.net平台 基于 XMPP协议的即时消息服务端简单实现 昨天抽空学习了一下XMPP,在网上找了好久,中文的资料太少了所以做这个简单的例子,今天才完成.公司也正在准备开发基于XMPP协议的即时通讯工具所以也算是打一个基础吧!如果你还没有了解过XMPP请先阅读附录中链接的文章,本实例是基agsXMPP上开发的,agsXMPP是C#写的支持开源XMPP协议软件,我们可以在agsXMPP上快速构建自已的即时通讯平台,我的这个例子只是修改了服务器端,因为agsXMPP本身自带的服务器端没有实现聊天功能.

《Linux多线程服务端编程——使用muduo C++网络库》学习笔记

第一章 线程安全的对象生命期管理 第二章 线程同步精要 第三章 多线程服务器的适用场合与常用编程模型 第四章 C++多线程系统编程精要 1.(P84)11个常用的最基本Pthreads函数: 2个:线程的创建和等待结束(join).封装为muduo::Thread 4个:mutex的创建.销毁.加锁.解锁.封装为muduo::MutexLock 5个:条件变量的创建.销毁.等待.通知.广播.muduo::Condition 2.(P85)不推荐使用读写锁的原因是它往往造成提高性能的错觉(允许多个

TCP/IP异步通讯服务端实现方法

近期做了个TCP/IP异步通讯服务端实现方法,也是在网上胡乱搜索,然找了个自认为比较好的,然后封装一下,供后面自个使用,也供大家参考,如有不好的地方,欢迎指正,谢谢! 下面说一下这个方法里面的几个知识点: 1.托管 这个东西真心好用,虽然不知道具体怎么弄的,托管可以实现一个对象中的方法交由其他对象实现,而且可以同时触发多个方法,组件的触发函数就是由托管实现的,具体实现如下: 先声明一个托管的方法类型 public delegate void RecieveMsg(string IP_addr,

Linux下C语言多线程,网络通信简单聊天程序

原文:Linux下C语言多线程,网络通信简单聊天程序 功能描述:程序应用多线程技术,可是实现1对N进行网络通信聊天.但至今没想出合适的退出机制,除了用Ctr+C.出于演示目的,这里采用UNIX域协议(文件系统套接字),程序分为客户端和服务端.应用select函数来实现异步的读写操作. 先说一下服务端:首先先创建套接字,然后绑定,接下进入一个无限循环,用accept函数,接受“连接”请求,然后调用创建线程函数,创造新的线程,进入下一个循环.这样每当有一个新的“连接”被接受都会创建一个新的线程,实现

基于Bmob服务的简单聊天(另加语音通知)

基于Bmob服务的简单聊天(另加语音通知) 这是一个基于bmob而开发的简单聊天界面,另加语音通知,这些都是在目前众多app中最常用到的功能 下载地址:http://www.devstore.cn/code/info/1174.html 运行截图:   热门源码下载: 高仿京东商城 Android快速开发不可或缺的11个工具类 Android快速开发框架LoonAndroid Android应用源码比较不错的新闻客户端 版权声明:本文为博主原创文章,未经博主允许不得转载.

spring + cxf 的webservice服务端和客户端功能

原文:spring + cxf 的webservice服务端和客户端功能 源代码下载地址:http://www.zuidaima.com/share/1550463730928640.htm spring + cxf 的webservice服务端和客户端功能. 提供页面调用ws和java代码调用两种方式. 引用jar包请下载:http://pan.baidu.com/s/1jGog2WI