Skip to content

Instantly share code, notes, and snippets.

@limboinf
Created May 11, 2016 13:08
Show Gist options
  • Save limboinf/d18386b18343c3022db9a7c65e1bf130 to your computer and use it in GitHub Desktop.
Save limboinf/d18386b18343c3022db9a7c65e1bf130 to your computer and use it in GitHub Desktop.
在套接字服务器中使用ForkingMixIn类
# coding=utf-8
"""
在套接字服务器中使用ForkingMixIn类
:copyright: (c) 2016 by fangpeng(@beginman.cn).
:license: MIT, see LICENSE for more details.
"""
import os
import socket
import threading
import SocketServer
SERVER_HOST = 'localhost'
SERVER_PORT = 0 # 内核会动态选择端口
BUF_SIZE = 1024
ECHO_MSG = "Hello echo serever!"
class ForkingServer(SocketServer.ForkingMixIn,
SocketServer.TCPServer):
"""Nothing to add here, inherited everything necessary from parents"""
pass
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 "Server sending response [current_process_id: data] = [%s]" % response
self.request.send(response)
return
class ForkingClient():
def __init__(self, ip, port):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect((ip, port))
def run(self):
current_process_id = os.getpid()
print "PID %s Sending echo message to the server: %s" % (current_process_id, ECHO_MSG)
send_data_length = self.sock.send(ECHO_MSG)
# Display server response
response = self.sock.recv(BUF_SIZE)
print "PID %s received %s" % (current_process_id, response[5:])
def shutdown(self):
self.sock.close()
def main():
# Launch the server
server = ForkingServer((SERVER_HOST, SERVER_PORT), ForkingServerRequestHandler)
ip, port = server.server_address
# 创建守护线程并启动服务
server_thread = threading.Thread(target=server.serve_forever) # 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
client1 = ForkingClient(ip, port)
client1.run()
client2 = ForkingClient(ip, port)
client2.run()
# Clean
server.shutdown()
client1.shutdown()
client2.shutdown()
server.socket.close()
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment