TreadingTCPServer实现的socket服务器内部会为每个client创建一个线程,该线程用来和客户端进行交互。

1、TreadingTCPServer基础

使用TreadingTCPServer:

  创建一个继承socketserver.BaseRequestHandler的类

  类中必须定义一个名称为handle的方法

  启动TreadingTCPServer

  1. import SocketServer
  2.  
  3. class MyServer(SocketServer.BaseRequestHandler):
  4.  
  5. def handle(self):
  6. # print self.request,self.client_address,self.server
  7. conn = self.request
  8. conn.sendall('欢迎致电 10086,请输入1xxx,0转人工服务.')
  9. Flag = True
  10. while Flag:
  11. data = conn.recv(1024)
  12. if data == 'exit':
  13. Flag = False
  14. elif data == '':
  15. conn.sendall('通过可能会被录音.balabala一大推')
  16. else:
  17. conn.sendall('请重新输入.')
  18.  
  19. if __name__ == '__main__':
  20. server = SocketServer.ThreadingTCPServer(('127.0.0.1',8009),MyServer)
  21. server.serve_forever()
  1. import socket
  2.  
  3. ip_port = ('127.0.0.1',8009)
  4. sk = socket.socket()
  5. sk.connect(ip_port)
  6. sk.settimeout(5)
  7.  
  8. while True:
  9. data = sk.recv(1024)
  10. print 'receive:',data
  11. inp = raw_input('please input:')
  12. sk.sendall(inp)
  13. if inp == 'exit':
  14. break
  15.  
  16. sk.close()

2、TreadingTCPServer源码剖析

TreadingTCPServer的类图关系如下:

内部调用流程为:

  1、启动服务端程序

  2、执行TCPServer.__init__方法,创建服务端socket对象并绑定IP和端口

  3、执行BaseServer.__init__方法,将自定义的继承自socketserver.BaseRequestHandler的类赋值给self.RequestHandlerClass

  4、执行BaseServer.server_forever方法,while循环一直监听是否有客户端请求到达

  5、当客户端链接到达服务器

  6、执行ThreadingMixIn.process_request方法,创建一个线程用来处理请求

  7、执行TreadingMixIn.process_request_thread方法

  8、执行BaseServer.finish_request方法,执行self.RequestHandleClass(),即:执行自定义MyRequestHandle的构造方法(自动调用基类BaseRequestHandler的构造方法,在该构造方法中会调用MyRequestHandler的handle方法)

源码精简:

  1. import socket
  2. import threading
  3. import select
  4.  
  5. def process(request, client_address):
  6. print request,client_address
  7. conn = request
  8. conn.sendall('欢迎致电 10086,请输入1xxx,0转人工服务.')
  9. flag = True
  10. while flag:
  11. data = conn.recv(1024)
  12. if data == 'exit':
  13. flag = False
  14. elif data == '':
  15. conn.sendall('通过可能会被录音.balabala一大推')
  16. else:
  17. conn.sendall('请重新输入.')
  18.  
  19. sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  20. sk.bind(('127.0.0.1',8002))
  21. sk.listen(5)
  22.  
  23. while True:
  24. r, w, e = select.select([sk,],[],[],1)
  25. print 'looping'
  26. if sk in r:
  27. print 'get request'
  28. request, client_address = sk.accept()
  29. t = threading.Thread(target=process, args=(request, client_address))
  30. t.daemon = False
  31. t.start()
  32.  
  33. sk.close()

从精简代码可以看出,socketserver的TreadingTCPServer之所以可以同时处理请求得益于select和Treading两个东西,其实本质上就是在服务器端为每个客户端创建一个线程,当前线程用来处理对应客户端的请求,所以,可以支持同事n个客户端链接(长连接)。

TreadingTCPServer的更多相关文章

  1. 网络编程之套接字socket

    目录 socket套接字 引子 为何学习socket一定要先学习互联网协议 socket是什么 套接字类型 基于文件类型的套接字家族 基于网络类型的套接字家族 套接字工作流程 基于TCP的套接字 简单 ...

随机推荐

  1. [PY3]——字符串的分割、匹配、搜索方法总结

    ?分割.匹配.搜索时可以用到什么样的解决方法? 分割方法总结 1. str.split( ) * 分割字符串 * 返回列表 s1='I love python' # 默认以空格为界定符,且多个空格都当 ...

  2. 布局xml里面所有元素详解

    被坑惨了,为了去掉一个元素,被各种莫名其妙的问题坑惨了.把所有常用到的都记录下来,不要再被坑到了 tools:context:http://blog.csdn.net/xiabing082/artic ...

  3. 写Markdown费事?Typora让你像写word一样行云流水,所见即所得。

    Typora 简介 Typora删除了预览窗口,以及所有其他不必要的干扰.取而代之的是实时预览. Markdown的语法因不同的解析器或编辑器而异,Typora使用的是GitHub Flavored ...

  4. SQL 之获取DATE类的年月日语句

    Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE( ...

  5. C#读取MySql表字段出现System.Byte[]问题

     记录下,用了多字段拼接后在程序中查询出的结果为System.Byte[],而在数据库中查正常 解决办法为:加Convert转换编码   select CONVERT((CASE background ...

  6. 面向对象(基础oop)之初识继承

    大家好,我叫李京阳,,很高兴认识大家,之所以我想开一个自己的博客,就是来把自己所了解的知识点通过自己的话写一下,希望被博客园的朋友们点评和一起讨论一下,也希望从博客园中多认识一些软件开发人员!现在我开 ...

  7. SecureCRT远程连接Linux下的sqlplus中退格键不能使用之解决方法

    ^H不是H键的意思,是backspace 主要是当你的终端backspace有问题的时候才需要设置   在linux环境下使用sqlplus,在回删(backspace)时往往会出现 一串的乱码.出现 ...

  8. R 语言—基本绘图

    https://www.harding.edu/fmccown/r/   这个网站上有壮观的 R 绘制的实际图形 下面只记录自己感兴趣的内容 单变量绘图下包含 1. 带状图 2. 茎叶图 3. 直方图 ...

  9. K:大数加法

    相关介绍:  在java中,整数是有最大上限的.所谓大数是指超过整数最大上限的数,例如18 452 543 389 943 209 789 324 233和8 123 534 323 432 323 ...

  10. IDEA使用maven建web项目示例

    运行环境:OSX-10.13.3. IDEA-2017.3.3. maven-3.5.2 步骤1:选择maven-webapp模板新建web项目 步骤2:设置项目GroupId等 需从网上下载相关构件 ...