3 x粒子光子。每个都充当HTTP服务器
1 x Raspberry Pi 3,它将充当HTTP客户端
在向任何一个光子请求HTTP GET之后,API返回:
{
node: 1,
uptime: 1234556,
location: 'back',
sensor: {
Eu: {// Euler Angles from IMU
h: 0, p: 0, r: 0
},
La: {// linear Acceleration values from IMU
x: 0, y: 0, z: 0
}
}
}
我想创建一个轮询方案,其中Raspberry Pi客户端在3个服务器中的每一个上每0.1秒执行一次HTTP GET。
不知道是否有HTTP轮询之类的东西,以及是否应该使用像Twisted by Python这样的异步库。
我想对如何在多服务器-单客户端模型中获得一些建议将功能WRT HTTP?
参考文献
每个粒子光子都具有对HTTP GET请求的上述JSON响应。
Raspberry Pi将用作HTTP客户端,试图获取每个粒子光子的请求。
#1 楼
我为@Chris Stratton所指的保持活动的tcp连接找到了一个很好的基本解决方案:import socket
# Set up a TCP/IP socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# Connect as client to a selected server
# on a specified port
s.connect(("url_to_device_n",80))
# Protocol exchange - sends and receives
s.send("GET /answer_json HTTP/1.0\n\n")
while True:
resp = s.recv(1024)
if resp == "": break
print resp, # here instead of print parse json
# Close the connection when completed
s.close()
print "\ndone"
您应该建立一个等待0.1s的永恒循环,然后建立一个永恒的循环这些连接和关闭之间的步骤,因此在启动时仅调用一次连接,仅在极端需要关闭所有内容时才关闭。
带螺纹的以前的作品:
import urllib2
from multiprocessing.dummy import Pool as ThreadPool
import socket
import time
def sendData( urlToDevice ):
# Set up a TCP/IP socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("url_to_device_n",80))
while True:
time.sleep(0.1)
# Protocol exchange - sends and receives
s.send("GET /answer_json HTTP/1.0\n\n")
while True:
resp = s.recv(1024)
if resp == "": break
print resp, # here instead of print parse json
# Close the connection when completed
s.close()
print "\ndone"
#########################
# This is main program: #
#########################
urls = [
'url_to_device_1',
'url_to_device_2',
'url_to_device_3',
'..',
'url_to_device_n',
]
# make the Pool of workers
pool = ThreadPool(n)
# open the urls in their own threads
results = pool.map(sendData, urls)
# close the pool and wait for the work to finish
pool.close()
pool.join()
来源:
http://www.wellho .net / resources / ex.php4?item = y303 / browser.py
https://stackoverflow.com/questions/2846653/how-to-use-threading-in-python
https://stackoverflow.com/questions/510348/how-can-i-make-a-time-delay-in-python
#2 楼
也许以下链接可以为您提供帮助:基本客户端示例:
https://docs.python.org/2/library/asyncore.html#asyncore-example-basic-http- client
基本的回显服务器示例:
https://docs.python.org/2/library/asyncore.html#asyncore-example-basic-echo-server
还,您是否考虑过使用UDP协议?可能会更好...
据我所知,我建议HTTP / 1.0在其实现中不是强制性的,以保持连接畅通,这是HTTP / 1.1中定义的;无论如何,它取决于实现,它可以有也可以没有。
import asyncore, socket
class HTTPClient(asyncore.dispatcher):
def __init__(self, host, path):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect( (host, 80) )
self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % path
def handle_connect(self):
pass
def handle_close(self):
self.close()
def handle_read(self):
print self.recv(8192)
def writable(self):
return (len(self.buffer) > 0)
def handle_write(self):
sent = self.send(self.buffer)
self.buffer = self.buffer[sent:]
client = HTTPClient('www.python.org', '/')
asyncore.loop()
import asyncore
import socket
class EchoHandler(asyncore.dispatcher_with_send):
def handle_read(self):
data = self.recv(8192)
if data:
self.send(data)
class EchoServer(asyncore.dispatcher):
def __init__(self, host, port):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.set_reuse_addr()
self.bind((host, port))
self.listen(5)
def handle_accept(self):
pair = self.accept()
if pair is not None:
sock, addr = pair
print 'Incoming connection from %s' % repr(addr)
handler = EchoHandler(sock)
server = EchoServer('localhost', 8080)
asyncore.loop()
评论
这对一切有什么帮助?您似乎提供了一个简单的例子来说明如何以困难的方式建立HTTP连接,但是在解决问题的实际问题上有什么用处-即,这如何帮助用户轮询多个设备?
–克里斯·斯特拉顿(Chris Stratton)
17年8月17日在21:33
评论
树莓派不仅限于一次与一台远程服务器对话。如果您可以让一个客户端使用保持活动的TCP连接,则可以一次使用三个副本,或者使用程序的三个副本,三个线程,或者实际上在一个线程中小心地处理文件描述符(可能在一个线程中)大select()循环。您可以从Pi使用浏览器。每个选项卡都是一个客户端,每个选项卡都可以访问不同的服务器。哪里出问题了?如果浏览器可以做到,您的代码也可以。很简单
可能最好在stackoverflow.com上询问编码问题,特别是因为这是一个纯HTTP问题且与设备无关