需要使用同一连接从服务器进行多次推送
Posted
技术标签:
【中文标题】需要使用同一连接从服务器进行多次推送【英文标题】:Need multiple push from server using same connection 【发布时间】:2018-08-21 12:14:26 【问题描述】:我正在尝试实现一个简单的 UI,它将显示在我的服务器控制台中写入的日志。已搜索但找不到满足我要求的解决方案。
根据我的设计,我有一个使用 Apache common-io api 跟踪日志文件的 java 程序。它可以帮助我减少内存开销,我不想在内存中保留大块。 因此,当客户端发出请求时,服务器将开始读取文件并逐步发送读取的数据,并一直显示直到客户端停止接收。我不希望发送多个请求,因为这会使应用程序一次又一次地读取文件,我需要维护一个状态/偏移量(可能的解决方案,但要避免它)。
我尝试使用异步响应检查 JAX-RS,但这似乎没有帮助。我不确定 HTTP/2 是否会有所帮助。
请帮助我了解如何实现这一点,以及我是否需要在客户端和服务器端实现套接字编程,或者是否有任何可以使用的此类协议。我愿意修改技术栈。
谢谢
【问题讨论】:
【参考方案1】:您可以使用任何支持持久流连接(有很多)的协议。
如果您已经在使用 JAX-RS,那么 StreamingOutput 可能就是您想要的。
【讨论】:
我尝试了使用以下方法的解决方案,但这是一次性给我解决方案,而不是分块发送。尝试 for (int i = 0; i 要清楚我需要什么类似于我们在 Jenkins 控制台日志中看到的。它不断刷新日志本身。而不是一次发送整个响应,我希望数据以块的形式流向客户端,而不是一次性作为流 我不确定我明白你在说什么。你想在每一行之后冲洗吗? 正是...通过每一行发送而不必每次都建立新连接 所以把它们寄过来。只需在每行后冲洗即可。顺便说一句,您使用Thread.currentThread().wait(3000);
的示例代码真的很糟糕。看来你不知道Thread.sleep(3000);
。【参考方案2】:
经过一番搜索,我终于找到了很多实现我提到的目标的方法。在我想解释如何使用 HTTP(特别是 Rest)无法实现之前。
HTTP 方式:在 HTTP 和/或 HTTP2 中,您可以使用两种版本中的长轮询或使用 http2 中存在的多路复用属性来创建持久连接的方法很少。在这两种情况下,TCP 中的底层协议没有太大区别。但是,在 HTTP/HTTP2 事务中,一旦服务器接收到请求并发送回响应,它就不会期望客户端再次接收响应,客户端也不期望接收到响应。所以一个完整的循环包括一对请求和响应。因此,如果您尝试发送另一个响应,则不能这样做,因为客户端和服务器都无法分别接收或发送该响应。谷歌有很多资源可以获取更深入的信息。This有很好的解释和参考
所以我尝试检查是否可以使用一些套接字编码来保持连接活动并传输数据。幸运的是,我偶然发现了另一种实现这一目标的方法。
我觉得对我的要求更有意义的两个如下。我不会为了避免在此处提供错误信息而尝试对其进行解释,因为我自己正在尝试获得更多见解。
1.服务器端事件 (SSE)
2。 WebSockets
This 将提供有关它们的票价建议。
【讨论】:
以上是关于需要使用同一连接从服务器进行多次推送的主要内容,如果未能解决你的问题,请参考以下文章