在python SocketServer中处理请求

时间:2019-02-18 15:09:22

标签: python socketserver

下面有一个代码可以正确进行客户端-服务器通信。 客户:

# Client
import socket
import pickle

class Model:
    def __init__(self, host, port):
        self.port = port
        self.host = host

    def snd_query(self, query):
        received_data = []
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
            sock.connect((self.host, self.port))
            sock.sendall(pickle.dumps(query))
            while True:
                packet = sock.recv(4096)
                if not packet or packet == b'':
                    break
                received_data.append(packet)
            try:
                content = pickle.loads(b"".join(received_data))
                return content
            except EOFError:
                return None

和服务器:

# Server.py
import socketserver
import pickle
import configparser
from data_manipulation import DataManipulation


class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        db = DataManipulation("data.db")
        request = pickle.loads(self.request.recv(1024))
        if request['command'] == 'GET':
            content = db.get_data()
        #elif ...:
            #... some other logic and database interactions
        self.request.sendall(pickle.dumps((content)))


def main(HOST, PORT):
    try:
        my_server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
        my_server.serve_forever()
    except KeyboardInterrupt:
        my_server.shutdown()
        my_server.server_close()


if __name__ == "__main__":
    config = configparser.ConfigParser()
    config.read('../params.ini')
    main(config['SERVER']['host'], int(config['SERVER']['port']))

以这种形式,为每个新处理的request创建一个数据库连接db实例。 我想避免它。我想做一个数据库对象,并用从ini文件中读取的参数来提高它。显然,只需阅读一次即可。

我发现的所有示例都显示了简单的回显服务器应用程序。 handle()的作用不大,只会打印一些东西。

我不确定在哪里调用db对象只有一个实例的正确位置?

如何在handle()方法中适当地合并一些高级逻辑?

0 个答案:

没有答案