让我直接举一个例子进一步解释。
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.
相反,我希望看到类似的东西:
我将如何实施呢?
答案 0 :(得分:1)
服务器在加载网页后是否可以将文字写入网页?是的,肯定是,但是这些天我怀疑它很少完成。我从1990年代开始进行Web开发,那时那是一种非常普遍的技术。我们使用它向没有Javascript的浏览器编写实时聊天消息。如今,Javascript无处不在且功能强大,因此在大多数情况下,使用客户端Javascript更新页面将是最佳选择。
也就是说,那时我们用来编写服务器端更新的技术现在应该仍然可以使用。我怀疑您在浏览器中看不到更新的原因是因为它不知道在加载所有内容之前它应该开始显示页面。使用chunked transfer encoding(一种仍受现代浏览器支持的1990年代技术)应该可以解决该问题。它允许服务器指示何时完成“大块”数据,浏览器通常会立即处理每个大块,而不是等待所有大块到达。
使用分块传输编码的最简单方法是使用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());
}
}