socket编程实现用户合法性验证,并将聊天记录存入数据库
最近在学习socket网络编程,参考了老男孩课程的一些讲解和网络的一些参考资料,实现用户合法性验证,并将聊天记录存入数据库的小功能。
推荐武沛齐老师的博客:http://www.cnblogs.com/wupeiqi/,他的博客给我python入门学习提供了很大的帮助。
本文意在分享一些学习的笔记和代码,并对自己学习所得进行总结。
首先解释Socket的含义:
Socket是用于描述IP地址和端口的一个通信链句柄,是应用层与TCP/IP协议簇通信的中间软件抽象层,它是一组接口,把复杂的TCP/IP协议簇隐藏在Socket接口后面,应用程序通过“套接字”像网络发出请求或者进行响应。Socket模块针对服务器端和客户端socket进行打开,读写,关闭,实现通信交互。
这段程序主要实现两部分小功能:
第一部分:server端对client的登录进行验证,通过访问数据库userinfo里面的数据查看该用户是否合法。
第二部分:输入用户名密码登录成功之后,客户端进行输入,server端将客户的数据保存到chatrecord这张聊天记录的表中
还有什么新的需求欢迎广大博友交流探讨。
具体代码如下:
1.数据访问层:
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 import pymysql 4 from backend import config 5 6 class MySqlHelper(object): 7 def __init__(self): 8 self.__ConnDict = config.ConnDict 9 10 def GetSimple(self,sql,params): 11 conn = pymysql.connect(**self.__ConnDict ) 12 cur = conn.cursor() 13 14 cur.execute(sql,params) 15 data = cur.fetchone() 16 17 cur.close() 18 conn.close() 19 return data 20 21 def InsSamples(self,sql,params): 22 23 conn = pymysql.connect(**self.__ConnDict) 24 cur = conn.cursor() 25 26 count = cur.execute(sql,params) 27 conn.commit() 28 29 cur.close() 30 conn.close() 31 return count 32
2.业务处理层:对具体表的操作
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 from uility.sqlhelper import MySqlHelper 5 6 class UserInfo(object): 7 def __init__(self): 8 self.sqlHelper = MySqlHelper() 9 10 def CheckLogin(self,user,pwd): 11 12 sql = '''select Nid, Name,Password from userinfo where Name=%s and Password = %s''' 13 params= user,pwd 14 result = self.sqlHelper.GetSimple(sql, params) 15 if not result: 16 return False 17 else: 18 return result['Nid'] 19 20 class ChatRecord(object): 21 def __init__(self): 22 self.sqlHelper = MySqlHelper() 23 24 def InsertRecord(self,message,date,userid): 25 26 sql = '''insert into chatrecord(Message,Date,UserId) values(%s,%s,%s) ''' 27 params = message,date,userid 28 self.sqlHelper.InsSamples(sql, params)
3.config文件:
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 from pymysql import cursors 5 ConnDict = dict(host='localhost',user='root',passwd='',db='milktea',charset='utf8',cursorclass=cursors.DictCursor)
4.Server
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 import socketserver 5 import json 6 import datetime 7 from model.models import UserInfo,ChatRecord 8 9 class MyServer(socketserver.BaseRequestHandler): 10 11 def handle(self): 12 userinfo = UserInfo() 13 chatrecord = ChatRecord() 14 15 conn = self.request 16 17 container = {'key':'','data':'','user':'','pwd':''} 18 container['data']='ok...' 19 result = json.dumps(container) 20 conn.sendall(result.encode('utf-8')) 21 22 flag = True 23 24 while flag: 25 data = conn.recv(1024) 26 rev_data = json.loads(data.decode('utf-8')) 27 print(rev_data['data']) 28 29 if rev_data['data']=='exit': 30 print('Goodbye') 31 rev_result = json.dumps(rev_data) 32 conn.send(rev_result.encode('utf-8')) 33 flag = False 34 #如果是空的,表示没有登录或者登录失败 35 if not rev_data['key']: 36 user = rev_data['user'] 37 pwd = rev_data['pwd'] 38 userid = userinfo.CheckLogin(user,pwd) 39 40 if userid: 41 rev_data['key'] = userid 42 rev_data['data'] = 'welcome to login!' 43 else: 44 rev_data['data'] = 'Login failed,Please input correct username and password! ' 45 46 rev_result = json.dumps(rev_data) 47 48 conn.sendall(rev_result.encode('utf-8')) 49 else: 50 date = datetime.datetime.now() 51 userid = rev_data['key'] 52 message = rev_data['data'] 53 chatrecord.InsertRecord(message, date, userid) 54 55 rev_data['data']='Got it' 56 rev_result = json.dumps(rev_data) 57 conn.send(rev_result.encode('utf-8')) 58 conn.close() 59 60 61 def setup(self): 62 pass 63 64 def finish(self): 65 pass 66 67 68 if __name__ == '__main__': 69 server = socketserver.ThreadingTCPServer(('127.0.0.1',8081),MyServer) 70 server.serve_forever()
5.Client
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 import socket 4 import json 5 6 def main(): 7 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 8 ip_port = ('127.0.0.1',8081) 9 client.connect(ip_port) 10 11 while True: 12 data = client.recv(1024) 13 rev_data = json.loads(data.decode('utf-8')) 14 print(rev_data['data']) 15 16 if rev_data['data']=='exit': 17 print('Goodbye') 18 break 19 20 if not rev_data['key']: 21 22 user = input('username:') 23 pwd = input('password:') 24 rev_data['user']= user 25 rev_data['pwd']= pwd 26 27 result = json.dumps(rev_data) 28 29 client.sendall(result.encode('utf-8')) 30 31 else: 32 inp = input('client:') 33 rev_data['data']=inp 34 35 result = json.dumps(rev_data) 36 client.send(result.encode(encoding='utf_8')) 37 38 if __name__ == '__main__': 39 main()