python網絡編程socket之多進程


#coding:utf-8
__author__ = 'similarface'

import os,socket,threading,SocketServer
SERVER_HOST='localhost'
SERVER_PORT=0
BUF_SIZE=1024
ECHO_MSG='HELLO'

class ForkedClient():
    def __init__(self,ip,port):
        #建立sock
        self.sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        #連接server
        self.sock.connect((ip,port))

    def run(self):
        #獲取當前的進程號
        current_process_id=os.getpid()
        print 'PID %s :" "%s"'%(current_process_id,ECHO_MSG)
        sent_data_length = self.sock.send(ECHO_MSG)
        print('發送:%d 長數據' % sent_data_length)
        #sever response
        response=self.sock.recv(BUF_SIZE)
        print "PID %s received: %s" % (current_process_id,response)

    def shutdown(self):
        '''
        清理sock的資源
        :return:
        '''
        self.sock.close()
        
class ForkingServerRequestHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        #接受客戶端的數據
        data=self.request.recv(BUF_SIZE)
        #當前的進程號碼
        current_process_id=os.getpid()
        #返回的數據包
        response='%s: %s' % (current_process_id, data)
        print "服務器返回 [current_process_id: data] =[%s]" %response
        #發送返回數據
        self.request.send(response)
        return

class ForkingServer(SocketServer.ForkingMixIn,SocketServer.TCPServer):
    pass

def main():
    #建立server
    server=ForkingServer((SERVER_HOST,SERVER_PORT),ForkingServerRequestHandler)
    #獲取IP 和 端口
    ip, port = server.server_address # Retrieve the port number
    #服務進程
    server_thread = threading.Thread(target=server.serve_forever)
    #是否放入后台
    server_thread.setDaemon(True) # don't hang on exit
    #啟動
    server_thread.start()
    print 'Server loop running PID: %s' %os.getpid()
    # Launch the client(s)
    client1 =  ForkedClient(ip, port)
    client1.run()
    client2 =  ForkedClient(ip, port)
    client2.run()
    # Clean them up
    server.shutdown()
    client1.shutdown()
    client2.shutdown()
    server.socket.close()
if __name__ == '__main__':
    main()

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM