Aeo*_*ave 6 python sockets multithreading request socketserver
我正在为我的 Raspberry Pi 编写一个 Python 服务器(带有 SocketServer)。该服务器等待传入的客户端并激活来自该远程连接的任何组件,例如继电器和 LED。这是我的第一个项目,所以我遇到了一些麻烦:
在我的 main 中,我创建对象并发送我想要控制的组件的数组列表;就像领导他自己的所有职能
Server.Server(ComponentList)
while True:
do stuff
Run Code Online (Sandbox Code Playgroud)
在 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
Run Code Online (Sandbox Code Playgroud)
最后在 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"
Run Code Online (Sandbox Code Playgroud)
类 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
Run Code Online (Sandbox Code Playgroud)
在循环中,在密码请求之后,我可以得到第一个选择(1,2或0),但我无法选择设备,并且我可以从 request.recv(1024) 获取另一个值。
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")
Run Code Online (Sandbox Code Playgroud)
程序跳过 data = self.request... 保持 data 为空并打印输出两次。
我想我错过了一些东西,我无法通过一个连接向服务器发送多个信息。
谢谢
| 归档时间: |
|
| 查看次数: |
935 次 |
| 最近记录: |