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编程-微软小兵的更多相关文章

  1. linux tcp/ip编程和windows tcp/ip编程差别以及windows socket编程详解

    最近要涉及对接现有应用visual c++开发的tcp客户端,花时间了解了下windows下tcp开发和linux的差别,从开发的角度而言,最大的差别是头文件(早期为了推广尽可能兼容,后面越来越扩展, ...

  2. win32下Socket编程(转载)

    在网上找了很多的资料,现将这些资料整合起来,详细介绍一下VC下的socket编程,并提供一个服务器客户端具体的实例.希望对您有所帮助 一.原理部分 (个人觉得这篇写的可以,所以转与此,原文地址:htt ...

  3. Windows Socket和Linux Socket编程的区别 ZZ

    socket相关程序从Windows移植到Linux下需要注意的: 1)头文件 Windows下winsock.h/winsock2.h Linux下sys/socket.h 错误处理:errno.h ...

  4. socket编程之中的一个:计算机网络基础

    在開始学习网络之前先复习下计算机网络基础吧. 鲁迅说,天下文章一大抄.看你会炒不会炒,基础知识就抄抄书吧. 一 分层模型 1 为什么分层 为了简化网络设计的复杂性.通讯协议採用分层结构.各层协议之间既 ...

  5. Socket编程模型之完毕port模型

    转载请注明来源:viewmode=contents">http://blog.csdn.net/caoshiying?viewmode=contents 一.回想重叠IO模型 用完毕例 ...

  6. 记一次:Windows的Socket编程学习和分析过程

    Socket编程依赖于:WS2_32.dll --- 服务端 --- .导入我们需要的函数 #incldue <windows.h> //#include<WinSock2.h> ...

  7. C++/C socket编程

    目录 socket()函数 何为socket Internet套接字 流格式套接字SOCK_STREAM 数据报格式套接字SOCK_DGRAM TCP/IP协议族 创建套接字 加载套接字库 Windo ...

  8. Linux下的C Socket编程 -- server端的继续研究

    Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...

  9. java socket编程(li)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以 ...

随机推荐

  1. ubuntu18.04 安装五笔拼音

    sudo apt install fcitx-table-wubi fcitx-table-wbpy 在输入法中加入五笔拼音就可以了,如果原来使用的是ibus, 改为fcitx后,重启机器.

  2. checkbox点击选中,再点击取消,并显示在文本框中

    function checkItem(e,itemId) { var item = document.getElementById(itemId); var $items = $(item); if ...

  3. MySql常用数据操作

    1.数据库操作: MySQL服务管理命令: 1.启动服务:sudo service mysql start 2.停止服务:sudo service mysql stop 3.重新启动服务:sudo s ...

  4. C++图书馆管理系统项目中部分功能代码实现(书籍推荐)

    bool UserServiceImpl::Compare1(Book b1,Book b2)//按照借阅次数比较{ if(b1.GetCnt() > b2.GetCnt()) { return ...

  5. RSA非对称加密算法实现过程

    RSA非对称加密算法实现过程 非对称加密算法有很多,RSA算法就是其中比较出名的算法之一,下面是具体实现过程 <?php /** */ class Rsa { /** * private key ...

  6. MySQL中CONCAT()的用法

    MySQL中CONCAT()的用法 在日常开发过程中,特别是在书写接口的时候,经常会遇到字符串拼接的情况,比如在返回图片数据时,数据库里往往存储的是相对路径,而接口里一般是存放绝对地址,这就需要字符串 ...

  7. Python基础——时间

    导入时间模块 import time 时间戳 print(time.time()) 获取本地时间 print(time.localtime(time.time())) 时间显示格式化 print(ti ...

  8. LeetCode(154) Find Minimum in Rotated Sorted Array II

    题目 Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allowed? W ...

  9. Cheese Aizu - 0558 (搜索题)

    Time limit8000 ms Memory limit131072 kB チーズ () 問題 今年も JOI 町のチーズ工場がチーズの生産を始め,ねずみが巣から顔を出した.JOI 町は東西南北に ...

  10. Mysql源码编译安装&主从复制

    一)camke源码编译安装mysql 1)创建软件安装目录software [root@master software]# ls cmake-2.8.8.tar.gz mysql-5.5.32.tar ...