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

代码目录结构:

aaarticlea/png;base64,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" alt="" />

__init__.py :空

models.py:

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3.  
  4. from sqlhelper import MySqlHelper
  5.  
  6. class UserInfo:
  7.  
  8. def __init__(self):
  9. self.sqlHelper = MySqlHelper()
  10.  
  11. def CheckLogin(self,name,pwd):
  12. '''验证用户名是否合法
  13. @param name:用户名
  14. @param pwd:密码
  15. @return: 如果登录成功,返回该用户的自增ID;否则,返回False
  16. '''
  17. sql = '''select Nid,Name,Password from UserInfo where Name=%s and Password = %s'''
  18. params = (name,pwd,)
  19. result = self.sqlHelper.GetSimple(sql, params)
  20. if not result:
  21. return False
  22. else:
  23. return result['Nid']
  24.  
  25. class ChatRecord:
  26.  
  27. def __init__(self):
  28. self.sqlHelper = MySqlHelper()
  29.  
  30. def InsertRecord(self,message,date,userid):
  31. '''插入聊天记录
  32. @param message:聊天信息
  33. @param date:时间
  34. @param userid:用户ID
  35. @return: 如果聊天记录插入成功,返回True;否则返回False
  36. '''
  37. sql = '''insert into ChatRecord(Message,Date,UserId) values(%s,%s,%s)'''
  38. params = (message,date,userid,)
  39. result = self.sqlHelper.InsSample(sql, params) #插入聊天记录,返回受影响条数,如果受影响条数为 1,表示插入成功
  40. if result != 1:
  41. return False
  42. else:
  43. return True
  44.  
  45. def GetRecord(self,userid):
  46. '''获取聊天记录
  47. @param userid:用户ID
  48. @return: 所有聊天记录
  49. '''
  50. sql = ''' select Message,Date from ChatRecord where UserId=%s '''
  51. params = (userid,)
  52. result = self.sqlHelper.GetDict(sql, params)#根据用户ID,获取该用户的所有聊天记录
  53. print result
  54. if not result:
  55. return False
  56. else:
  57. return result

sqlhelper.py:

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3.  
  4. import MySQLdb
  5. import _mysql_exceptions
  6.  
  7. class MySqlHelper:
  8.  
  9. def __init__(self):
  10. self.__connDict = {'host':'127.0.0.1','user':'root','passwd':'1234','db':'milkteaDB'}
  11.  
  12. def GetSimple(self,sql,params):
  13. '''获取单条数据
  14. @param sql:sql语句
  15. @param params:参数
  16. @return: 数据
  17. '''
  18. conn = MySQLdb.connect(**self.__connDict)
  19. cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)
  20. cur.execute(sql,params)
  21. data = cur.fetchone()
  22. cur.close()
  23. conn.close()
  24. return data
  25.  
  26. def GetDict(self,sql,params):
  27. '''获取多条数据(字典类型)'''
  28. conn = MySQLdb.connect(**self.__connDict)
  29. cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)
  30. cur.execute(sql,params)
  31. data = cur.fetchall()
  32. cur.close()
  33. conn.close()
  34. return data
  35.  
  36. def InsSample(self,sql,params):
  37. '''插入单条数据
  38. @return: 受影响的条数
  39. '''
  40. conn = MySQLdb.connect(**self.__connDict)
  41. cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)
  42. count = cur.execute(sql,params)
  43. conn.commit()
  44. cur.close()
  45. conn.close()
  46. return count
  47.  
  48. def InsSample_ReturnId(self,sql,params):
  49. '''插入单条数据
  50. @return: 返回自增ID
  51. '''
  52. conn = MySQLdb.connect(**self.__connDict)
  53. cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)
  54. cur.execute(sql,params)
  55. id = cur.lastrowid
  56. conn.commit()
  57. cur.close()
  58. conn.close()
  59. return id

client.py

  1. #!/usr/bin/env python
  2. #coding:GBK
  3.  
  4. import socket
  5. import sys
  6. import json
  7.  
  8. ip_port = ('127.0.0.1',9998)
  9. sk = socket.socket()
  10. sk.connect(ip_port)
  11.  
  12. container = {'key':'','data':''}
  13. while True:
  14. data = sk.recv(1024)
  15. rev_data = json.loads(data)
  16. print rev_data['data']
  17. if not rev_data['key']:
  18. user = raw_input('username:')
  19. pwd = raw_input('password:')
  20. rev_data['data']=[user,pwd]
  21. sk.sendall(json.dumps(rev_data))
  22. else:
  23. inp = raw_input('reply:')
  24. rev_data['data'] = inp
  25. sk.sendall(json.dumps(rev_data))
  26. if inp == 'exit':
  27. break
  28. sk.close()

server.py:

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3.  
  4. import SocketServer
  5. import json
  6. import time
  7. from backend.models import UserInfo,ChatRecord
  8.  
  9. class MyServer(SocketServer.BaseRequestHandler):
  10.  
  11. def setup(self):
  12. pass
  13.  
  14. def handle(self):
  15. #userinfo = UserInfo() #实例化一个用户表操作类
  16. #chatrecord = ChatRecord() #实例化一个记录表操作类
  17.  
  18. container = {'key':'','data':''}
  19. container['data'] = 'ok...'
  20.  
  21. conn = self.request
  22. conn.sendall(json.dumps(container))
  23. Flag = True
  24. while Flag:
  25. try:
  26. data = conn.recv(1024)
  27. print data
  28. rev_data = json.loads(data)
  29. if rev_data['data'] == 'exit':
  30. conn.close()
  31. break
  32. #如果key为空,则表示用户没有登录或登录失败
  33. if not rev_data['key']:
  34. name,pwd = rev_data['data']
  35. #re = userinfo.CheckLogin(name, pwd)
  36. re = 1
  37. if re:
  38. rev_data['key'] = re
  39. rev_data['data'] = '约吗?'
  40. else:
  41. rev_data['data'] = 'failed.'
  42. conn.sendall(json.dumps(rev_data))
  43. #用户已经登录
  44. else:
  45. datetime = time.strftime('%Y-%m-%d %H:%M:%S')
  46.  
  47. if rev_data['data']=='list': #聊天记录
  48. #rev_data['data'] = chatrecord.GetRecord(rev_data['key'])
  49. pass
  50.  
  51. elif rev_data['data'].__contains__('yes'):
  52. #如果用户输入的是yes,那么就把用户输入的记录保存到数据
  53. #chatrecord.InsertRecord(rev_data['data'], datetime, rev_data['key'])
  54. rev_data['data'] = 'I am gay.'
  55. #把聊天机器人的回复也保存到数据库
  56. #chatrecord.InsertRecord(rev_data['data'], datetime, rev_data['key'])
  57. else:
  58. #如果用户输入的不是yes,把用户输入的记录保存到数据
  59. #chatrecord.InsertRecord(rev_data['data'], datetime, rev_data['key'])
  60. rev_data['data'] = 'what?'
  61. #把聊天机器人的回复也保存到数据库
  62. #chatrecord.InsertRecord(rev_data['data'], datetime, rev_data['key'])
  63. conn.sendall(json.dumps(rev_data))
  64. except Exception,e:
  65. print e
  66. Flag = False
  67. def finish(self):
  68. pass
  69.  
  70. if __name__ == '__main__':
  71. server = SocketServer.ThreadingTCPServer(('127.0.0.1',9998),MyServer)
  72. 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. pysql用类进行封装

    pyMySQL用类进行封装 class SqlHelper(object): def __init__(self): self.connect() def connect(self): self.co ...

  2. 获取页面的title值

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. graphviz 绘制架构图

    架构图: 1.依赖调用关系.(类似文献引用关系, graphviz 自动将每一次调用升一次层级) 2.依赖调用可能是上下层级调用,也可能是同层级引用. 需人工去梳理出这些关系 3. 引用多的用颜色标识 ...

  4. Flask-基本原理与核心知识

    虚拟环境 使用pipenv创建一个虚拟环境和项目绑定,安装:E:\py\qiyue\flask>python3 -m pip install pipenv 和项目绑定:到项目的目录中pipenv ...

  5. Oracle 数据库常用SQL语句(2)查询语句

    一.SQL基础查询 1.select语句 格式:select 字段 from 表名; 2.where 用于限制查询的结果. 3.查询条件 > < >= <= = != 4.与 ...

  6. CSS基础:block,inline和inline-block

    css的display属性是前端开发中非常常见的属性,本文简单介绍下其中比较常用的属性值,即block.inline和inline-block. HTML组件中呈现一片空白区域的组件都可当盒模型(bo ...

  7. 公用表表达式CTE简单递归使用-简单树形结构

    1.建表脚本 CREATE TABLE [dbo].[tb_tree]( ,) NOT NULL, [ParentId] [int] NULL, ) NULL, CONSTRAINT [PK_tb_t ...

  8. Django 惰性机制

    惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行sql ...

  9. Python使用gevent实现协程

    Python中多任务的实现可以使用进程和线程,也可以使用协程. 一.协程介绍 协程,又称微线程.英文名Coroutine.协程是Python语言中所特有的,在其他语言中没有. 协程是python中另外 ...

  10. 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 ...