socket编程-微软小兵
2016-01-27 20:41
375 查看
socket两端建立连接,不断开的连接的情况下做数据交互,[b]客户端发送数据和服务端返回数据。直到客户端要求断开,则关闭连接。[/b]
代码目录结构:
![](data:image/png;base64,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)
__init__.py :空
models.py:
sqlhelper.py:
client.py
server.py:
代码目录结构:
__init__.py :空
models.py:
#!/usr/bin/env python #coding:utf-8 from sqlhelper import MySqlHelper class UserInfo: def __init__(self): self.sqlHelper = MySqlHelper() def CheckLogin(self,name,pwd): '''验证用户名是否合法 @param name:用户名 @param pwd:密码 @return: 如果登录成功,返回该用户的自增ID;否则,返回False ''' sql = '''select Nid,Name,Password from UserInfo where Name=%s and Password = %s''' params = (name,pwd,) result = self.sqlHelper.GetSimple(sql, params) if not result: return False else: return result['Nid'] class ChatRecord: def __init__(self): self.sqlHelper = MySqlHelper() def InsertRecord(self,message,date,userid): '''插入聊天记录 @param message:聊天信息 @param date:时间 @param userid:用户ID @return: 如果聊天记录插入成功,返回True;否则返回False ''' sql = '''insert into ChatRecord(Message,Date,UserId) values(%s,%s,%s)''' params = (message,date,userid,) result = self.sqlHelper.InsSample(sql, params) #插入聊天记录,返回受影响条数,如果受影响条数为 1,表示插入成功 if result != 1: return False else: return True def GetRecord(self,userid): '''获取聊天记录 @param userid:用户ID @return: 所有聊天记录 ''' sql = ''' select Message,Date from ChatRecord where UserId=%s ''' params = (userid,) result = self.sqlHelper.GetDict(sql, params)#根据用户ID,获取该用户的所有聊天记录 print result if not result: return False else: return result
sqlhelper.py:
#!/usr/bin/env python #coding:utf-8 import MySQLdb import _mysql_exceptions class MySqlHelper: def __init__(self): self.__connDict = {'host':'127.0.0.1','user':'root','passwd':'1234','db':'milkteaDB'} def GetSimple(self,sql,params): '''获取单条数据 @param sql:sql语句 @param params:参数 @return: 数据 ''' conn = MySQLdb.connect(**self.__connDict) cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor) cur.execute(sql,params) data = cur.fetchone() cur.close() conn.close() return data def GetDict(self,sql,params): '''获取多条数据(字典类型)''' conn = MySQLdb.connect(**self.__connDict) cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor) cur.execute(sql,params) data = cur.fetchall() cur.close() conn.close() return data def InsSample(self,sql,params): '''插入单条数据 @return: 受影响的条数 ''' conn = MySQLdb.connect(**self.__connDict) cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor) count = cur.execute(sql,params) conn.commit() cur.close() conn.close() return count def InsSample_ReturnId(self,sql,params): '''插入单条数据 @return: 返回自增ID ''' conn = MySQLdb.connect(**self.__connDict) cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor) cur.execute(sql,params) id = cur.lastrowid conn.commit() cur.close() conn.close() return id
client.py
#!/usr/bin/env python #coding:GBK import socket import sys import json ip_port = ('127.0.0.1',9998) sk = socket.socket() sk.connect(ip_port) container = {'key':'','data':''} while True: data = sk.recv(1024) rev_data = json.loads(data) print rev_data['data'] if not rev_data['key']: user = raw_input('username:') pwd = raw_input('password:') rev_data['data']=[user,pwd] sk.sendall(json.dumps(rev_data)) else: inp = raw_input('reply:') rev_data['data'] = inp sk.sendall(json.dumps(rev_data)) if inp == 'exit': break sk.close()
server.py:
#!/usr/bin/env python #coding:utf-8 import SocketServer import json import time from backend.models import UserInfo,ChatRecord class MyServer(SocketServer.BaseRequestHandler): def setup(self): pass def handle(self): #userinfo = UserInfo() #实例化一个用户表操作类 #chatrecord = ChatRecord() #实例化一个记录表操作类 container = {'key':'','data':''} container['data'] = 'ok...' conn = self.request conn.sendall(json.dumps(container)) Flag = True while Flag: try: data = conn.recv(1024) print data rev_data = json.loads(data) if rev_data['data'] == 'exit': conn.close() break #如果key为空,则表示用户没有登录或登录失败 if not rev_data['key']: name,pwd = rev_data['data'] #re = userinfo.CheckLogin(name, pwd) re = 1 if re: rev_data['key'] = re rev_data['data'] = '约吗?' else: rev_data['data'] = 'failed.' conn.sendall(json.dumps(rev_data)) #用户已经登录 else: datetime = time.strftime('%Y-%m-%d %H:%M:%S') if rev_data['data']=='list': #聊天记录 #rev_data['data'] = chatrecord.GetRecord(rev_data['key']) pass elif rev_data['data'].__contains__('yes'): #如果用户输入的是yes,那么就把用户输入的记录保存到数据 #chatrecord.InsertRecord(rev_data['data'], datetime, rev_data['key']) rev_data['data'] = 'I am gay.' #把聊天机器人的回复也保存到数据库 #chatrecord.InsertRecord(rev_data['data'], datetime, rev_data['key']) else: #如果用户输入的不是yes,把用户输入的记录保存到数据 #chatrecord.InsertRecord(rev_data['data'], datetime, rev_data['key']) rev_data['data'] = 'what?' #把聊天机器人的回复也保存到数据库 #chatrecord.InsertRecord(rev_data['data'], datetime, rev_data['key']) conn.sendall(json.dumps(rev_data)) except Exception,e: print e Flag = False def finish(self): pass if __name__ == '__main__': server = SocketServer.ThreadingTCPServer(('127.0.0.1',9998),MyServer) server.serve_forever()
相关文章推荐
- C++文件读写
- php中error与exception的区别及应用
- python有面向过程、面向对象、函数式编程,面向切面编程、泛型编程多种编程范式
- 学习一下Java---0(总起)
- 小蚂蚁学习C语言(36)——题目——字符串的倒置
- 2016/01/27 Head First Java 第一节小结
- Fedora21修改jdk为1.7版并安装Eclipse
- Coursera课程《大家的python》(Python for everyone)课件
- QT信号槽连接
- 解决java抽象函数重写报错的问题
- Java导出Excel文件
- UTF-8, Unicode, GB2312格式串转换之C语言版
- [土狗之路]coursera上C语言进阶第二周作业
- 类和对象—复数类
- Go语言代码自动更新服务器代码分享
- 公共技术点之 Java 动态代理
- Coursera课程《大家的Python》中一些资料
- java word转pdf 方式 大家一起来优化
- Matlab基本操作
- java多线程总结