在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ SocketServer怎么從內(nèi)部程序關(guān)閉

SocketServer怎么從內(nèi)部程序關(guān)閉

最近要處理socket并發(fā),發(fā)現(xiàn)Python提供的SocketServer很好用,于是我自己試了下。廢話不多說,先上一波代碼。
服務(wù)端:

import SocketServer
class RequestHandler(SocketServer.BaseRequestHandler):
    def __init__(self, request, client_address, server):
        self.request = request
        self.client_address = client_address
        self.server = server
        self.setup()
        try:
            self.handle()
        finally:
            self.finish()

    def handle(self):
        print 'running'
        while True:
            try:
                data = self.request.recv(1024)
                print data, self.client_address
                if data == 'exit':
                    print 'exit'
                    self.request.close()
                    self.server.close()
                    break
                
            except Exception as e:
                self.request.close()
                self.server.close()
                break
                

客戶端:

import socket
def send_exit():
    ser = socket.socket()
    ser.connect(('127.0.0.1', 12345))  # 12348
    ser.sendall('exit')
    ser.close()
if __name__ == '__main__':
    send_exit()
    

先運行服務(wù)端,再運行客戶端。
最終結(jié)果是
clipboard.png
請問各位大佬,SocketServer啟動的服務(wù),如何在程序內(nèi)部關(guān)閉?

回答
編輯回答
亮瞎她

我用的python3

1.data是字節(jié)流,比較時用 if data == b'exit':
2.用shutdown來關(guān)閉socketserver

代碼如下:

#!/usr/bin/env python
# coding=utf-8

import socketserver
class RequestHandler(socketserver.BaseRequestHandler):
    def __init__(self, request, client_address, server):
        self.request = request
        self.client_address = client_address
        self.server = server
        self.setup()
        try:
            self.handle()
        finally:
            self.finish()

    def handle(self):
        print ('running')
        while True:
            try:
                data = self.request.recv(1024)
                if(data==b''):
                    continue
                print (data)
                if data == b'exit':
                    print ('exit')
                    self.server.shutdown()
                    self.request.close()
                    break

            except Exception as e:
                self.server.shutdown()
                self.request.close()
                break

if __name__ == '__main__':
    # socketserver的多進(jìn)程非阻塞啟動
    server = socketserver.ThreadingTCPServer(('0.0.0.0',12345),RequestHandler)
    server.serve_forever()
2017年6月12日 01:59