#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()