- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个小型 Rust 应用程序,它通过串行端口接收一些请求,进行一些处理并将结果保存在本地。我想使用浏览器作为远程监视器,这样我就可以看到正在发生的一切,据我所知,SSE 非常适合这一点。
我尝试为此使用 Iron,但找不到保持连接打开的方法。请求处理程序都需要返回一个 Response
,所以我不能继续发送数据。
这是我的(愚蠢的)尝试:
fn monitor(req: &mut Request) -> IronResult<Response> {
let mut headers = Headers::new();
headers.set(ContentType(Mime(TopLevel::Text, SubLevel::EventStream, vec![])));
headers.set(CacheControl(vec![CacheDirective::NoCache]));
println!("{:?}", req);
let mut count = 0;
loop {
let mut response = Response::with((iron::status::Ok, format!("data: Count!:{}", count)));
response.headers = headers.clone();
return Ok(response); //obviously won't do what I want
count += 1;
std::thread::sleep_ms(1000);
}
}
最佳答案
我认为简短的回答是:你不能。当前版本的 Iron 是建立在单一的请求-响应交互之上的。这可以在您的代码中看到,因为发送响应的唯一方法是返回它;终止处理程序线程。
Iron 中存在问题 utilize the new async support in Hyper ,它本身就是 merged relatively recently .甚至还有other people trying to use Server-Send Events in Hyper还没有成功。
如果你愿意使用 Hyper master 分支,这样的事情似乎可行。无法保证这是一个好的解决方案,或者它不会耗尽您的所有 RAM 或 CPU。它似乎在 Chrome 中工作。
extern crate hyper;
use std::time::{Duration, Instant};
use std::io::prelude::*;
use hyper::{Control, Encoder, Decoder, Next };
use hyper::server::{Server, HandlerFactory, Handler, Request, Response};
use hyper::status::StatusCode;
use hyper::header::ContentType;
use hyper::net::{HttpStream};
fn main() {
let address = "0.0.0.0:7777".parse().expect("Invalid address");
let server = Server::http(&address).expect("Invalid server");
let (_listen, server_loop) = server.handle(MyFactory).expect("Failed to handle");
println!("Starting...");
server_loop.run();
}
struct MyFactory;
impl HandlerFactory<HttpStream> for MyFactory {
type Output = MyHandler;
fn create(&mut self, ctrl: Control) -> Self::Output {
MyHandler {
control: ctrl,
}
}
}
struct MyHandler {
control: Control,
}
impl Handler<HttpStream> for MyHandler {
fn on_request(&mut self, _request: Request<HttpStream>) -> Next {
println!("A request was made");
Next::write()
}
fn on_request_readable(&mut self, _request: &mut Decoder<HttpStream>) -> Next {
println!("Request has data to read");
Next::write()
}
fn on_response(&mut self, response: &mut Response) -> Next {
println!("A response is ready to be sent");
response.set_status(StatusCode::Ok);
let mime = "text/event-stream".parse().expect("Invalid MIME");
response.headers_mut().set(ContentType(mime));
every_duration(Duration:: from_secs(1), self.control.clone());
Next::wait()
}
fn on_response_writable(&mut self, response: &mut Encoder<HttpStream>) -> Next {
println!("A response can be written");
// Waited long enough, send some data
let fake_data = r#"event: userconnect
data: {"username": "bobby", "time": "02:33:48"}"#;
println!("Writing some data");
response.write_all(fake_data.as_bytes()).expect("Failed to write");
response.write_all(b"\n\n").expect("Failed to write");
Next::wait()
}
}
use std::thread;
fn every_duration(max_elapsed: Duration, control: Control) {
let mut last_sent: Option<Instant> = None;
let mut count = 0;
thread::spawn(move || {
loop {
// Terminate after a fixed number of messages
if count >= 5 {
println!("Maximum messages sent, ending");
control.ready(Next::end()).expect("Failed to trigger end");
return;
}
// Wait a little while between messages
if let Some(last) = last_sent {
let elapsed = last.elapsed();
println!("It's been {:?} since the last message", elapsed);
if elapsed < max_elapsed {
let remaining = max_elapsed - elapsed;
println!("There's {:?} remaining", remaining);
thread::sleep(remaining);
}
}
// Trigger a message
control.ready(Next::write()).expect("Failed to trigger write");
last_sent = Some(Instant::now());
count += 1;
}
});
}
和客户端JS:
var evtSource = new EventSource("http://127.0.0.1:7777");
evtSource.addEventListener("userconnect", function(e) {
const obj = JSON.parse(e.data);
console.log(obj);
}, false);
关于rust - 我如何在 Iron 中使用 Server-Sent 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38179117/
我阅读了一些关于 Iron javascript 的内容,但我要去哪里下载它? http://dotnet.dzone.com/articles/pumping-iron-javascript. 最佳
我正在尝试让一个简单的 Iron 示例起作用: extern crate iron; extern crate router; use iron::prelude::*; use iron::stat
我一直梦想从脚本语言创建一个“真正的 exe”。随着基于 DLR 的 Python 和 Ruby 实现可用,这是否更接近现实? 我想创建一个“真正的应用程序”: 一个 Windows 窗体应用程序 控
我正在通过iron.io入门指南进行操作:http://dev.iron.io/worker/getting_started/ 我正在采取步骤: Push it to Docker Hub and r
我在使用 iron-scroll-threshold 以及与其他页面共享同一主机的 iron-page 时遇到问题。 我的应用程序 UI 顶部有 paper-tabs。随着选项卡的更改,页面会延迟加载
我最近一直在使用 Polymer,我有一个熨斗选择器,在纸质抽屉中放满了纸质图标元素以供导航之用。但出于某种原因,我无法让他们链接: Home
我正在使用 Polymer 1.0 和 Golang 1.5。 我从 Go 发送一个带有 400 Bad Request 和一些内容的 json 响应,如下所示: d := struct{ M
我想花一些时间来了解更多关于构建在 DLR 之上的动态语言的知识,但我不确定哪种语言更适合学习。 时间有限,我真的只有时间去学习其中之一。 从长远来看,关于这两者(Iron Ruby 或 Iron P
我正在尝试运行 O'Reilly 出版的 Programming Rust 一书中的示例,但我坚持要使以下代码成功编译: Cargo.toml [package] name = "gcd-online
我正在探索 Iron Web 框架的功能。据我所知,Iron core 没有可处理的 APIHTTP 参数,所以我尝试使用 params crate。 error: the trait bound `
您会推荐 Iron Ruby、Iron Python 或 PowerShell 来使 C# 应用程序成为脚本宿主吗? 经过一些快速的修改,现在我倾向于 powershell 主要有两个原因(请注意,这
我正在尝试为 Iron 请求创建一个处理程序: extern crate iron; extern crate mount; use iron::{Iron, Request, Response, I
在 Polymer 文档 ( https://elements.polymer-project.org/elements/iron-input ) 中,我发现: 而在另一个官方文档(https://
在生产系统中开始使用 Iron Ruby 和 Iron Python 可以吗?此外,托管它们是否有任何其他要求? 另外,考虑到 F# 是一种与 Python 相同的函数式编程语言,在 .NET 框架中
在模板助手中,我从 Iron.Router (iron:router) 获取当前路径如下: Router.current().route.path(this); 这工作正常,除非路由路径确实包含参数
polymer 1.* 在父元素中,我使用Polymer.IronValidatableBehavior。 我的回调函数 arg this.setInvalidStates 存在范围问题。在子元素 b
所以我试图创建一个 DataGridViewColumn 的子类,它既有一个无参数构造函数,又有一个采用一个参数的构造函数,该参数需要 DataGridViewCell 类型。这是我的课: class
我在一个相当复杂的应用程序中使用 Iron Router,并且有一些路由将用户重定向到其他内部路由(例如, "/" 总是重定向到 "/dashboard" )。 我们一直在通过添加例如Router.g
有没有办法在IronRouter中进入下一页之前获取上一页位置? 有没有我可以用来获取这些信息的事件? 提前致谢。 最佳答案 由于 Iron Router 使用通常的 History API,因此您可
我有这个元素: ... Polymer({ ... _handleResponse: function(event){ co
我是一名优秀的程序员,十分优秀!