socket编程-微软小兵
socket两端建立连接,不断开的连接的情况下做数据交互,客户端发送数据和服务端返回数据。直到客户端要求断开,则关闭连接。
代码目录结构:
aaarticlea/png;base64,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" alt="" />
__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编程-微软小兵的更多相关文章
- linux tcp/ip编程和windows tcp/ip编程差别以及windows socket编程详解
最近要涉及对接现有应用visual c++开发的tcp客户端,花时间了解了下windows下tcp开发和linux的差别,从开发的角度而言,最大的差别是头文件(早期为了推广尽可能兼容,后面越来越扩展, ...
- win32下Socket编程(转载)
在网上找了很多的资料,现将这些资料整合起来,详细介绍一下VC下的socket编程,并提供一个服务器客户端具体的实例.希望对您有所帮助 一.原理部分 (个人觉得这篇写的可以,所以转与此,原文地址:htt ...
- Windows Socket和Linux Socket编程的区别 ZZ
socket相关程序从Windows移植到Linux下需要注意的: 1)头文件 Windows下winsock.h/winsock2.h Linux下sys/socket.h 错误处理:errno.h ...
- socket编程之中的一个:计算机网络基础
在開始学习网络之前先复习下计算机网络基础吧. 鲁迅说,天下文章一大抄.看你会炒不会炒,基础知识就抄抄书吧. 一 分层模型 1 为什么分层 为了简化网络设计的复杂性.通讯协议採用分层结构.各层协议之间既 ...
- Socket编程模型之完毕port模型
转载请注明来源:viewmode=contents">http://blog.csdn.net/caoshiying?viewmode=contents 一.回想重叠IO模型 用完毕例 ...
- 记一次:Windows的Socket编程学习和分析过程
Socket编程依赖于:WS2_32.dll --- 服务端 --- .导入我们需要的函数 #incldue <windows.h> //#include<WinSock2.h> ...
- C++/C socket编程
目录 socket()函数 何为socket Internet套接字 流格式套接字SOCK_STREAM 数据报格式套接字SOCK_DGRAM TCP/IP协议族 创建套接字 加载套接字库 Windo ...
- Linux下的C Socket编程 -- server端的继续研究
Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...
- java socket编程(li)
一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以 ...
随机推荐
- pysql用类进行封装
pyMySQL用类进行封装 class SqlHelper(object): def __init__(self): self.connect() def connect(self): self.co ...
- 获取页面的title值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- graphviz 绘制架构图
架构图: 1.依赖调用关系.(类似文献引用关系, graphviz 自动将每一次调用升一次层级) 2.依赖调用可能是上下层级调用,也可能是同层级引用. 需人工去梳理出这些关系 3. 引用多的用颜色标识 ...
- Flask-基本原理与核心知识
虚拟环境 使用pipenv创建一个虚拟环境和项目绑定,安装:E:\py\qiyue\flask>python3 -m pip install pipenv 和项目绑定:到项目的目录中pipenv ...
- Oracle 数据库常用SQL语句(2)查询语句
一.SQL基础查询 1.select语句 格式:select 字段 from 表名; 2.where 用于限制查询的结果. 3.查询条件 > < >= <= = != 4.与 ...
- CSS基础:block,inline和inline-block
css的display属性是前端开发中非常常见的属性,本文简单介绍下其中比较常用的属性值,即block.inline和inline-block. HTML组件中呈现一片空白区域的组件都可当盒模型(bo ...
- 公用表表达式CTE简单递归使用-简单树形结构
1.建表脚本 CREATE TABLE [dbo].[tb_tree]( ,) NOT NULL, [ParentId] [int] NULL, ) NULL, CONSTRAINT [PK_tb_t ...
- Django 惰性机制
惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行sql ...
- Python使用gevent实现协程
Python中多任务的实现可以使用进程和线程,也可以使用协程. 一.协程介绍 协程,又称微线程.英文名Coroutine.协程是Python语言中所特有的,在其他语言中没有. 协程是python中另外 ...
- graph-Dijkstra's shortest-path alogorithm
直接贴代码吧,简明易懂. 后面自己写了测试,输入数据为: a b c d e 0 1 4 0 2 2 1 2 3 1 3 2 1 4 3 2 1 1 2 3 4 2 4 5 4 3 1 也就是课本上1 ...