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  
View Code

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)
View Code

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)
View Code

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

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

 

转载于:https://www.cnblogs.com/candychen20170109/p/6277194.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值