grizzly 可以进行服务器推送,同时保持与客户端的连接吗?
Posted
技术标签:
【中文标题】grizzly 可以进行服务器推送,同时保持与客户端的连接吗?【英文标题】:can grizzly do a server-push, while connection is maintained to a client? 【发布时间】:2015-09-29 08:10:49 【问题描述】:我正在开发一个将客户端连接到平台(服务器)的代理。该代理基于 grizzly 框架。我的代理收到我的客户的请求,要求将他注册到平台。所以我的代理会执行这个操作。然后我的代理将等待来自平台的操作,并将这些操作通知客户端。所以我的代理和客户之间的连接将保持不变。如果来自平台的新操作,我将向客户端发送服务器推送,因为我的客户端与我保持连接。我不希望客户端发送来自平台(轮询)的新操作请求。我希望我的代理将操作(POST 请求)推送给我的客户。我知道这种服务器推送与客户端服务器模型不同,但我听说可以使用 grizzly。
到目前为止,我确实发现了一些有助于在 Java 中实现这个想法的东西。来自 grizzly 的此链接 https://grizzly.java.net/spdy.html 描述了服务器推送,但此服务器推送不适用于我的情况,因为当 http 请求来自客户端时执行推送服务器。
是否可以使用 grizzly 来实现这个想法?
如果是,怎么做?
Edit1:我在使用 grizzly-framework 的 http-server 时发现了另一个问题。我的代理由两个方面组成:服务器端从客户端获取请求,客户端连接到平台。我的代理将收到来自客户的请求。基于 grizzly 的代理将启动一个 http-handler(我的客户端代理)来分析这个请求。分析请求后,此处理程序将连接到平台。操作完成后,他会向客户端发送http/1.1 200 OK。如果同一个客户端决定在平台上向我发送一个新操作,我应该开始一个与平台的新连接,这意味着我要为同一个客户端实例化一个新的客户端代理(http-handler)。我的意思是我无权访问旧实例(旧客户端代理),我必须创建一个新实例,这意味着我需要避免它的大量流量。 在这种情况下,如果一个处理程序执行了它的非阻塞操作,那么这个处理程序就丢失了,所以我无法访问他,这意味着我无法从平台获取操作并进行服务器推送。如果我暂停handler一段时间,所有来自其他客户端的请求都会被阻塞,所以客户端无法服务。
【问题讨论】:
【参考方案1】:IMO SPDY 或 HTTP/2 不能很好地满足您的需求,因为正如您所指出的,它们发送的推送必须始终与初始客户端到服务器请求相关联。 我建议看看 WebSocket [1]、[2]。
[1]https://grizzly.java.net/websockets.html [2]https://tyrus.java.net/
【讨论】:
好吧,我从没用过 websockets。我们假设我的代理使用 websocket 协议。我的客户应该使用这个协议吗? 是的,websocket 目前被 web 浏览器和许多 HTTP/websocket 客户端支持。以上是关于grizzly 可以进行服务器推送,同时保持与客户端的连接吗?的主要内容,如果未能解决你的问题,请参考以下文章