这个相对于多进程更加简单,每accept一个新的连接就创建一个新的线程。代码如下:

# coding: utf-8
import socket
import sys
import errno
import threading
from time import ctime class ClientThread(threading.Thread):
def __init__(self, client_socket, client_address):
threading.Thread.__init__(self)
self.client_socket = client_socket
self.client_address = client_address def run(self):
self.handle_connection() def handle_connection(self):
while True:
data = self.client_socket.recv(1024)
if not data:
print 'disconnect', self.client_address
self.client_socket.close()
break;
else:
self.client_socket.send('[%s] %s' % (ctime(), data)) #回显消息 if __name__ == '__main__':
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_address = ('localhost', 9981)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(listen_address)
server_socket.listen(10) while True:
try:
(client_socket, client_address) = server_socket.accept()
except IOError, e:
if e.errno == errno.EINTR:
continue #继续等待
else:
raise #将异常向外throw
print 'Got connection from ', client_address
t = ClientThread(client_socket, client_address)
t.start()

注意这里的thread不能进行join,否则会阻塞主线程,丧失并发能力。

另外,python中的线程不需要进行detach。

最新文章

  1. wep.py输出hello world
  2. opencv删除二值图中较小的噪点色块
  3. Sql order by 和 group BY一起使用时需要注意
  4. win7下用mklink命令解决delphiXE系列占用C盘空间的问题
  5. JAVA测试装饰者模式
  6. tmux 配置
  7. Dictionary到List转换中的性能问题 转
  8. R语言——绘图函数深入学习
  9. Spark踩坑记——从RDD看集群调度
  10. 不用媒体查询做web响应式设计-遁地龙卷风
  11. Oracle SQL优化[转]
  12. 201521123010 《Java程序设计》第11周学习总结
  13. ssh密码
  14. 【微信小程序】
  15. 题解 P1801 【黑匣子_NOI导刊2010提高(06)】
  16. jQuery源码——.html()方法原理解析
  17. python 之模块random
  18. 了解java虚拟机—在TALB上分配对象(10)
  19. [UE4]时间轴线TimeLine,Lerp插值
  20. C# 模拟多线程下载文件

热门文章

  1. DRF基类APIView提供的Request、Response和序列化器的综合使用
  2. ubuntu 16.04安装redis(源码安装)zz
  3. 使用bottle进行web开发(6):Response 对象
  4. 怎么在32位windows系统上搭建爬虫框架scrapy?
  5. php使用gd库将文字转换成图片(转)
  6. CentOS7 中把默认yum源更换成163源
  7. AC日记——Magazine Ad codeforces 803d
  8. 大数模板(Java)
  9. PHP Shell生成工具Weevely
  10. [UOJ198]时空旅行