socket编程-微软小兵

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()
时间: 2024-12-09 02:06:38

socket编程-微软小兵的相关文章

socket编程之一:计算机网络基础

在开始学习网络之前先复习下计算机网络基础吧. 鲁迅说,天下文章一大抄,看你会炒不会炒,基础知识就抄抄书吧. 一 分层模型 1 为什么分层 为了简化网络设计的复杂性,通讯协议采用分层结构,各层协议之间既相互独立又相互高效的协调工作. 对于复杂的通信协议,其结构应该是采用层次的.分层的协议可以带来很多便利: 分层的好处有: a> 灵活性好:当任何一层发生变化时,只要层间接口关系保持不变,则在这层以上或以下各层均不受影响. 此外,对某一层提供的服务还可进行修改.当某层提供的服务不再需要时,甚至可以将这

Windows Socket和Linux Socket编程的区别 ZZ

socket相关程序从Windows移植到Linux下需要注意的: 1)头文件 Windows下winsock.h/winsock2.h Linux下sys/socket.h 错误处理:errno.h 2)初始化 Windows下需要用WSAStartup Linux下不需要 3)关闭socket Windows下closesocket(...) Linux下close(...) 4)类型 Windows下SOCKET Linux下int 如我用到的一些宏: #ifdef WIN32 typed

Socket编程模型之完成端口模型

转载请注明来源:http://blog.csdn.net/caoshiying?viewmode=contents 一.回顾重叠IO模型 用完成例程来实现重叠I/O比用事件通知简单得多.在这个模型中,主线程只用不停的接受连接即可:辅助线程判断有没有新的客户端连接被建立,如果有,就为那个客户端套接字激活一个异步的WSARecv操作,然后调用SleepEx使线程处于一种可警告的等待状态,以使得I/O完成后CompletionROUTINE可以被内核调用.如果辅助线程不调用SleepEx,则内核在完成

起步socket编程 C#

用C#来编写SOCKET程序,总的来说还是比较方便的,微软帮忙我们做了很多工作.SOCKET编程应用很多, 相关资料网上也很多,因为工作需要,前一段时间也用C#编写一个socket程序,在这里写一下也算一个记录. 在服务器端创建一个Socket,使用Bind方法绑定所指定的接口使Socket与一个本地终结联,并通过Listen方法侦听该接口上的请求,当侦听到用户端的连接时,调用Accept完成连接的操作,创建新的Socket以处理传入的连接请求. 使用完Socket后,记住使用Shutdown方

多线程下SOCKET编程

SOCKET编程往往离不开多线程,说到多线程,总的说来还是一个比较复杂的东西,尤其是业务逻辑变得复杂的时候,有时候或者说经常,会弄得人头晕脑胀.但是C#,相对好一点,因为微软封装了,帮我们做很多工作,但是在实际的编码过程中,往往会出现各种各样的错误或者BUG. 这里先写一个简单的多线程函数,这样有个初步的理解,也算是入门了,相信大家不用多论述就能明白. public static void Start() { Thread t1 = new Thread(ExceMethod); t1.IsBa

win32下Socket编程(转载)

在网上找了很多的资料,现将这些资料整合起来,详细介绍一下VC下的socket编程,并提供一个服务器客户端具体的实例.希望对您有所帮助 一.原理部分 (个人觉得这篇写的可以,所以转与此,原文地址:http://dev.yesky.com/78/2683078.shtml) 在网络编程中最常用的方案便是Client/Server (客户机/服务器)模型.在这种方案中客户应用程序向服务器程序请求服务.一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一 直处于休眠状态,直到一个客

【转】Windows Socket和Linux Socket编程有什么区别

socket相关程序从Windows移植到Linux下需要注意的: 1)头文件 Windows下winsock.h/winsock2.h Linux下sys/socket.h 错误处理:errno.h 2)初始化 Windows下需要用WSAStartup Linux下不需要 3)关闭socket Windows下closesocket(...) Linux下close(...) 4)类型 Windows下SOCKET Linux下int 如我用到的一些宏: #ifdef WIN32 typed

Socket编程模型之完毕port模型

转载请注明来源:viewmode=contents">http://blog.csdn.net/caoshiying?viewmode=contents 一.回想重叠IO模型 用完毕例程来实现重叠I/O比用事件通知简单得多.在这个模型中,主线程仅仅用不停的接受连接就可以:辅助线程推断有没有新的client连接被建立,假设有.就为那个client套接字激活一个异步的WSARecv操作,然后调用SleepEx使线程处于一种可警告的等待状态,以使得I/O完毕后CompletionROUTINE能

iOS开发——网络编程OC篇&Socket编程

Socket编程 一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议   对应于应用层 tcp协议    对应于传输层 ip协议     对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要