- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我希望通过 HTTP 传输一组日志消息。我想一次发送一行消息,可能在行与行之间有延迟,我希望每一行在服务器发送后尽快显示在浏览器中。
我目前的做法是将Content-Type
设置为text/plain; charset=UTF-8
在响应中,并根据需要从服务器开始流式传输行,它们之间有延迟。我确保在每次写入后刷新所有相关的输出流。
我在 Chrome 中观察到的行为是它会等到响应完全完成后再显示任何内容。但我想要的行为是在发送时查看每一行。这可能吗?
我已经提出了很多关于这个主题的 stackoverflow 问题,但没有一个能完全回答我的问题。我认为 Transfer-Encoding
与我无关,因为那似乎是为了下载大文件(如果我错了请纠正我)。
这不是关于下载文件的问题,因为我希望这些行直接在浏览器中呈现。
最佳答案
由于 question and answer 中提到的问题,我认为您无法在这里完成“最正确”的解决方案由 Ivan 链接.至少我的 Chrome 和 Firefox 可以毫不费力地逐行呈现他们收到的最新内容,但是,正如上面所说,它需要 hack 或更改要求以使其更加透明。
这里要做的第一件事是获取但抑制第一个前导 n 字节以触发浏览器呈现。
如果你选择 text/plain
,您只能依赖特定浏览器如何呈现输出文本。要抑制第一个虚拟 block 输出,您可以只渲染空格,因为它们既不打算由人也不打算由浏览器解析(至少我是这么认为的,因为您想要浏览器内输出,因此可能不会使其成为机器-可解析)。这里的一个技巧是编写 Unicode \u200B
( zero width space ) 希望目标浏览器将使用它在输出窗口中呈现任何内容。不幸的是,我的 Firefox 实例无法识别该字符并呈现默认的未知字符占位符。然而,Chrome 完全忽略了这些字符,在视觉上它们看起来什么都不是!这似乎是你所需要的。所以,这里的通用算法是:
0xEF
、0xBB
、0xBF
)以确保 Chrome won't start the download the remote output to a file .\u200B
字符 n 次,其中 n 在前一项中确定并刷新输出。但是,如果您希望 \u200B
没有像 Firefox 那样的输出渲染问题。性格,你可能想切换到text/html
. HTML 支持标记注释,因此我们可以排除某些内容不被呈现。这允许完全依赖 HTML,而不是特定的浏览器细节。知道了这一点,算法就变得有些不同了:
<!--
渲染 block 的开始,然后是一些 n 空格(但据我所知至少有一个;或任何 HTML 注释),然后是 -->
. n 应该是上面 block 的长度减去注释开始/结束标记的长度。<br/>
结尾或 <br>
, 然后立即冲洗。这种方法对我来说在 Chrome 和 Firefox 中都很好用。如果您对某些 Java 没问题,这里有一些实现上述内容的代码:
@RestController
@RequestMapping("/messages")
public final class MessagesController {
private static final List<String> lines = asList(
"Lorem ipsum dolor sit amet,",
"consectetur adipiscing elit,",
"sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
);
@RequestMapping(value = "html", method = GET, produces = "text/html")
public void getHtml(final HttpServletRequest request, final ServletResponse response)
throws IOException, InterruptedException {
render(Renderers.HTML, request, response);
}
@RequestMapping(value = "text", method = GET, produces = "text/plain")
public void getText(final HttpServletRequest request, final ServletResponse response)
throws IOException, InterruptedException {
render(Renderers.PLAIN, request, response);
}
private static void render(final IRenderer renderer, final HttpServletRequest request, final ServletResponse response)
throws IOException, InterruptedException {
final int stubLength = getStubLength(request);
final ServletOutputStream outputStream = response.getOutputStream();
renderer.renderStub(stubLength, outputStream);
renderInfiniteContent(renderer, outputStream);
}
private static int getStubLength(final HttpServletRequest request) {
final String userAgent = request.getHeader("User-Agent");
if ( userAgent == null ) {
return 0;
}
if ( userAgent.contains("Chrome") ) {
return 1024;
}
if ( userAgent.contains("Firefox") ) {
return 1024;
}
return 0;
}
private static void renderInfiniteContent(final IRenderer renderer, final ServletOutputStream outputStream)
throws IOException, InterruptedException {
for ( ; ; ) {
for ( final String line : lines ) {
renderer.renderLine(line, outputStream);
sleep(5000);
}
}
}
private interface IRenderer {
void renderStub(int length, ServletOutputStream outputStream)
throws IOException;
void renderLine(String line, ServletOutputStream outputStream)
throws IOException;
}
private enum Renderers
implements IRenderer {
HTML {
private static final String HTML_PREFIX = "<!-- ";
private static final String HTML_SUFFIX = " -->";
private final int HTML_PREFIX_SUFFIX_LENGTH = HTML_PREFIX.length() + HTML_SUFFIX.length();
@Override
public void renderStub(final int length, final ServletOutputStream outputStream)
throws IOException {
outputStream.print(HTML_PREFIX);
for ( int i = 0; i < length - HTML_PREFIX_SUFFIX_LENGTH; i++ ) {
outputStream.write('\u0020');
}
outputStream.print(HTML_SUFFIX);
outputStream.flush();
}
@Override
public void renderLine(final String line, final ServletOutputStream outputStream)
throws IOException {
outputStream.print(htmlEscape(line, "UTF-8"));
outputStream.print("<br/>");
}
},
PLAIN {
private static final char ZERO_WIDTH_CHAR = '\u200B';
private final byte[] bom = { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
@Override
public void renderStub(final int length, final ServletOutputStream outputStream)
throws IOException {
outputStream.write(bom);
for ( int i = 0; i < length; i++ ) {
outputStream.write(ZERO_WIDTH_CHAR);
}
outputStream.flush();
}
@Override
public void renderLine(final String line, final ServletOutputStream outputStream)
throws IOException {
outputStream.println(line);
outputStream.flush();
}
}
}
}
此外,您要实现的方法不会向下滚动浏览器窗口。您可能想在 Chrome 中使用用户脚本自动向下滚动特定的 URL 页面,但据我所知,它不适用于 text/plain
。虽然输出。
关于http - 通过 HTTP 传输纯文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41276289/
表架构 DROP TABLE bla; CREATE TABLE bla (id INTEGER, city INTEGER, year_ INTEGER, month_ INTEGER, val I
我需要拆分字符串/或从具有以下结构的字符串中获取更容易的子字符串。 字符串将来自 window.location.pathname 或 window.location.href,看起来像 text/n
每当将对象添加到数组中时,我都会尝试更新 TextView ,并在 TextView 中显示该文本,如下所示: "object 1" "object 2" 问题是,每次将新对象添加到数组时,它都会覆盖
我目前正在寻找使用 Java 读取网站可见文本并将其存储为纯文本字符串的方法。 换句话说,我想转换成这样: Hello stupid World进入“ Hello World ” 或者类似的东西 Un
我正在尝试以文本和 HTML 格式发送电子邮件,但无法正确发送正确的 header 。特别是,我想设置 Content-Type header ,但我找不到如何为 html 和文本部分单独设置它。 这
我尝试了上面的代码,但我无法绑定(bind)文本,我怎样才能将资源内部文本 bloc
我刚刚完成了 Space Shooter 教程,由于没有 GUIText 对象,所以我创建了 UI.Text 对象并进行了相应的编码。它在统一播放器中有效,但在构建 Web 应用程序后无效。我花了一段
我有这个代码: - (IBAction)setButtonPressed:(id)sender { NSUserDefaults *sharedDefaults = [[NSUserDefau
抱歉标题含糊不清,但我想不出我想在标题中做什么。无论如何,对于图像上的文本,我使用了 JLabel 文本并将其添加到图标中。 JLabel icon = new JLabel(new Imag
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我在将 Twitter 嵌入到我从 HTML 5 转换的 wordpress 运行网站时遇到问题。 我遇到的问题是推文不是我的自定义字体... 这是我无法使用任何 css 定位的 HTML 代码,我正
我正在尝试找到解决由于使用以下形式的代码而导致的冗余字符串连接问题的最佳方法: logger.debug("Entering loop, arg is: " + arg) // @1 在大多数情况下,
我写了这个测试 @Test public void removeRequestTextFromRouteError() throws Exception { String input = "F
我目前正在创建一个正则表达式来拆分所有匹配以下格式的字符串:&[文本],并且需要获取文本。字符串可能类似于:something &[text] &[text] everything &[text] 等
有没有办法将标题文本从一个词变形为另一个词,同时保留两个词中使用的字母?我看过的许多 css 文本动画大多是视觉的,很少有旋转整个单词的。 我想要做的是从一个词过渡,例如“BEACH”到“CHANGE
总结matplotlib绘图如何设置坐标轴刻度大小和刻度。 上代码: ?
我在容器 (1) 中创建了容器 (2)。你能帮忙如何向容器(1)添加文本吗?下面是我的代码 return Scaffold( body: Padding( padding: c
我似乎找不到任何人或任何人这样做过。我试图限制我们使用的图像数量,并想创建一个带有渐变作为其“颜色”的文本,并在其周围设置渐变轮廓/描边 到目前为止,我还没有看到任何将两者结合在一起的东西。 我可以自
我正在为视频游戏暗黑破坏神 2 使用 discord.py 构建一个不和谐机器人。其中一项功能要求机器人从暗黑破坏神 2 屏幕截图中提取项目的名称和属性。我目前正在为此使用 pytesseract,但
我很难弄清楚如何旋转 strip.text theme 中的属性来自 ggplot2 .我使用的是 R 版本 3.4.2 和 ggplot2 版本 2.2.1。 以下是 MWE 的数据。 > dput
我是一名优秀的程序员,十分优秀!