多進程監聽多端口
# 多線程socket
# 程序監聽兩個端口,端口邏輯相同其中一個端口放在子進程下
# 每次請求會在產生一個進程處理請求
import SocketServer
from multiprocessing import Process
class MyServer(SocketServer.BaseRequestHandler):
def handle(self):
conn=self.request
conn.sendall('hello')
while True:
data=str(conn.recv(1024))
conn.sendall('server:'+data)
if __name__ == '__main__':
server1=SocketServer.ForkingTCPServer(('127.0.0.1',8000),MyServer)
server1.max_children=2
server2 = SocketServer.ForkingTCPServer(('127.0.0.1', 9000), MyServer)
server2.max_children = 2
p=Process(target=server2.serve_forever,args=())
p.start()
# server1需放在p.start后啟動不然會阻塞進程,server2無法啟動
server1.serve_forever()
p.join()
# print 'hah'
多線程把ForkingTCPServer換成ThreadingTCPServer去掉max_children配置即可
注:
坑! 若使用多線程,因為無法配置線程數,並發太高會導致服務器產生很多進程也許會達到服務器顯示的單個用戶最多進程數,從而導致異常(linux 默認普通用戶限制1024)
client
import socket
ip=('127.0.0.1',8000)
sk=socket.socket()
sk.connect(ip)
sk.settimeout(10)
while True:
data=sk.recv(1024)
print('receive: %s',data)
inp=raw_input('please input:')
sk.sendall(bytes(inp))
if inp == 'exit':
break
sk.close()