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
原创粉丝点击