码迷,mamicode.com
首页 > 其他好文 > 详细

socket编程-微软小兵

时间:2016-01-27 21:33:50      阅读:504      评论:0      收藏:0      [点我收藏+]

标签:

socket两端建立连接,不断开的连接的情况下做数据交互,客户端发送数据和服务端返回数据。直到客户端要求断开,则关闭连接。

代码目录结构:

 

技术分享

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

 

socket编程-微软小兵

标签:

原文地址:http://www.cnblogs.com/robinunix/p/5164495.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!