利用socketserver实现异步多线程服务端简单聊天功能
生活随笔
收集整理的這篇文章主要介紹了
利用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 Codeclient.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 Codesqlhelper.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 Codeconf.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实现异步多线程服务端简单聊天功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 15个最佳的代码评审(Code Revi
- 下一篇: 在angularjs应用中如何做选择评星