Learning Python echo_server 多线程,多进程和SocketServer模块
来源:互联网 发布:货物记账软件 编辑:程序博客网 时间:2024/05/05 06:13
之前的一篇博客用C语言几种范式的echo sever,这次用Python实现多线程,多进程的echo server和C语言的实现非常类似,以为Python提供了和C类似的socket,thread和process的api,然后用python的SocketServer模块实现一个echo_server。多线程和多进程的echo server范式具体参考之前的那篇博客。
多进程
# coding:utf-8import socketimport osif __name__ == '__main__':sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_address = ('localhost', 8000)sock.bind(server_address)sock.listen(16)while True:# connection is a socket object and client_address is a stringconnection, client_address = sock.accept()try:pid = os.fork()if (pid != 0):# parent process just continuecontinuewhile True:# receive receive at most 16 char a timedata = connection.recv(16)if data:print 'sending data back to the client', data.strip()connection.sendall(data)else:raise print 'no data from client'breakfinally:connection.close()
多线程
# coding:utf-8import socketimport threadingdef fuck(args):connection = argstry:while True:# receive receive at most 16 char a timedata = connection.recv(16)if data:print 'send back %s' % (data.strip())connection.sendall(data)else:breakfinally:connection.close()if __name__ == '__main__':sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_address = ('localhost', 8000)sock.bind(server_address)sock.listen(1)while True:connection, client_address = sock.accept()print 'connection from', client_addresst = threading.Thread(name = 'fuck', target = fuck, args = (connection,))t.setDaemon(True) # or you must kill all the client to <ctrl-c> the servert.start()
SocketServer提供了TCP和UDP和Handle的类,通过几次一个Handle类并实现其handle方法,然后继承或直接使用一天TCP类,就可以方便的实现一个echo server,这里我使用
SocketServer.StreamRequestHandler和SocketServer.ThreadingTCPServer两个类,具体参考官方文档和这里的介绍,值得注意的是ThreadingTCPServer文档和pyhotw并没有描述,看源代码知道后它其实为了方便继承了ThreadingMixin和TCPServer的类:class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
代码如下:
# encoding:utf-8import SocketServerimport socketimport loggingimport tracebackimport sysclass MyHandler(SocketServer.StreamRequestHandler):def handle(self):sock = self.connectionlogging.info('new request')try:while True:data = sock.recv(64)if data:print 'receive data is %s send it back', data.strip('\n')sock.sendall(data)else:raise Exception("fuck client is off")except Exception, e:logging.warning('send response failed, traceback: %s' % traceback.format_exc())class MyEchoServer(SocketServer.ThreadingTCPServer):allow_reuse_address = Truerequest_queue_size = 1024if __name__ == '__main__':server = MyEchoServer(('', 8000), MyHandler)server.serve_forever()
0 0
- Learning Python echo_server 多线程,多进程和SocketServer模块
- Python SocketServer模块
- [Python]SocketServer模块
- python -- 单线程、多线程SocketServer
- python 多进程和多线程
- python 多线程和多进程
- python多进程和多线程
- Python 多进程和多线程
- Python多线程和多进程
- Python多进程和多线程
- Python网络通信之黏包问题(五)基于SocketServer模块和socket模块
- python socket编程(二)--SocketServer模块
- python的Socketserver模块使用,异常处理
- Python socket模块编程 SocketServer框架
- python socket编程(2)-SocketServer 模块
- Python Network Programming(8)---SocketServer模块
- python模块介绍- SocketServer 网络服务框架
- python模块介绍- SocketServer 网络服务框架
- Intersection of Two Linked Lists
- 欢迎使用CSDN-markdown编辑器
- JSON简介以及用法代码汇总
- 1004. 成绩排名 (20)
- 如何学习硬件设计——实践篇
- Learning Python echo_server 多线程,多进程和SocketServer模块
- Android中的Looper,MessageQueue,Handler的理解
- 白话文看信息论
- csu 1640 机智的刷题方式(完全背包)
- JAVA集合类(大公司面试喜欢问的)
- 考试前的零散学习【1】网络地址a.b.c.d/x;数据报分片
- 用缓动函数模时钟
- 最长回文子串
- ubuntu下将android4.4源码导入adt-bundle