让我直接举个例子来进一步解释。
final var socket = new java.net.ServerSocket(1234);
for (;;)
{
try (final var client = socket.accept())
{
client.getOutputStream().write("HTTP/1.1 200 OK\r\n\r\n".concat(java.time.Instant.now().toString()).getBytes());
}
}
当我现在打开我选择的浏览器 (Firefox
咳咳) 时,我将收到当前时间和日期。现在的问题是我如何在以后的某个时间点写入该套接字。
假设的解决方案
这是我已经尝试过的方法,但根本不起作用。
final var socket = new java.net.ServerSocket(1234);
for (;;)
{
try (final var client = socket.accept())
{
client.getOutputStream().write("HTTP/1.1 200 OK\r\n\r\n".concat(java.time.Instant.now().toString()).getBytes());
client.getOutputStream().flush();
Thread.sleep(1000L);
client.getOutputStream().write("And another paragraph.".getBytes());
}
}
结果是网页加载大约一秒钟,打印出以下结果(可能因您的日期和时间不同而有所不同)。
2019-01-19T18:19:15.607192500Z
And another paragraph.
相反,我希望看到类似的东西:
- 打印出当前时间和日期。
- 稍等一下,网页内容没有变化。
- 打印下一段。
我将如何实现它?
最佳答案
服务器是否可以在加载后将文本写入网页?是的,它确实是,但这些天我怀疑它很少完成。我在 1990 年代开始进行 Web 开发,那时候那是一种非常普遍的技术。我们用它在没有 Javascript 的情况下将实时聊天消息写入浏览器。如今 Javascript 无处不在且功能强大,因此在大多数情况下,使用客户端 Javascript 更新页面将是最佳选择。
也就是说,我们当时用于编写服务器端更新的技术现在应该仍然有效。我怀疑您在浏览器中看不到更新的原因是因为它不知道应该在加载所有内容之前开始显示页面。使用chunked transfer encoding ,现代浏览器仍然支持的 1990 年代技术应该可以解决这个问题。它允许服务器指示数据“ block ”何时完成,浏览器通常会立即处理每个 block ,而不是等待所有 block 到达。
使用分块传输编码的最简单方法是使用 HTTP 库,如 Apache HttpComponents ,然后将您的输出流包装在适当的类中:
final var socket = new java.net.ServerSocket(1234);
for (;;)
{
try (final var client = socket.accept())
{
var outputStream = new ChunkedOutputStream(client.getOutputStream());
outputStream.write("HTTP/1.1 200 OK\r\n\r\n".concat(java.time.Instant.now().toString()).getBytes());
outputStream.flush();
Thread.sleep(1000L);
outputStream.write("And another paragraph.".getBytes());
}
}
关于java - 加载后是否可以将文本写入网页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54270083/