具有多个请求的SocketServer Python

时间:2015-03-29 02:31:44

标签: python multithreading sockets request socketserver

我正在为我的Raspberry Pi编写一个Python服务器(带有SocketServer)。 此服务器等待传入的客户端并激活来自该远程连接的任何组件,如中继和LED。 这是我的第一个项目,所以我遇到了一些麻烦:

在我的主要我创建对象,我发送我想要控制的组件的arraylist;喜欢带着他自己的所有功能

Server.Server(ComponentList)
while True:
    do stuff
在Server.py中的

我启动服务器并设置一些设置

class Server(): 
def __init__(self, ComponentList):
    self.ComponentList = ComponentList
    self.current_component = 0
    self.server = Socket.ThreadedTCPServer((settings.HOSTNAME,settings.PORT), Socket.ThreadedTCPRequestHandler)
    self.server_thread = threading.Thread(target=self.server.serve_forever)
    self.server_thread.daemon = True
    self.server_thread.start() 
    self.server.set_componentlist(self.ComponentList)
    self.server.set_current_component(self.current_component)

def set_current_component(self, current_component):
    self.current_component = current_component

def get_current_component(self):
    return self.current_component

def set_componentlist(self, ComponentList):
    self.ComponentList = ComponentList

def get_componentlist(self):
    return self.ComponentList

最后在Socket.py中,我编写了生成错误的真实服务器

class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):

def handle(self):

    print "Client connected with ", self.client_address

    self.request.send("Insert Password\r\n")
    if self.request.recv(1024).strip() == settings.PASSWORD:
        time.sleep(1)
        self.request.send("Correct password\r\n")
        try:
            while 1:
                data = None
                self.request.send("---------------------\r\n")
                self.request.send("Listening for commands\r\n")
                self.request.send("1: Connected devices\r\n")
                self.request.send("2: Select devices\r\n")
                self.request.send("0: Close connection\r\n")
                self.request.send("---------------------\r\n")
                data = self.request.recv(1024).strip()
                if data is not None:
                    if data == "1":
                        self.request.send(str(len(self.server.get_componentlist()))+" Components loaded\r\n")
                        c=0
                        for i in self.server.get_componentlist():
                            self.request.send(str(str(c)+": "+i.get_note()+"\r\n"))
                            c=c+1
                    if data == "2":
                        data = self.request.recv(1024).strip()
                        self.request.send("Select component id\r\n")
                        self.server.set_current_component(data)
                        self.request.send("Selected component: "+data+"\r\n")
                    if data == "0":
                        break

        finally:
            self.request.close()
            print "Client exited"

    else:
        time.sleep(1)
        self.request.send("Incorrect password\r\n")
        self.request.send("Bye\r\n")
        self.request.close()
        print "Client unauthorized"

class ThreadedTCPServer(SocketServer.ThreadingMixIn,SocketServer.TCPServer):

allow_reuse_address = True

def set_componentlist(self, ComponentList):
    self.ComponentList = ComponentList

def get_componentlist(self):
    return self.ComponentList

def set_current_component(self, current_component):
    self.current_component = current_component

def get_current_component(self):
    return self.current_component

在循环中,在密码请求之后,我可以得到第一个选择(1,2或0),但我无法选择设备,我可以从request.recv(1024)获得另一个值。 / p>

if data == "2":
                        data = self.request.recv(1024).strip()
                        self.request.send("Select component id\r\n")
                        self.server.set_current_component(data)
                        self.request.send("Selected component: "+data+"\r\n")

程序跳过data = self.request ...保持数据为空 并打印输出两次。

我想我错过了一些东西,我无法通过一个连接向服务器发送多个信息。

由于

0 个答案:

没有答案