0

我想使用 Atmosphere (1.0.12) 创建原型,但我目前的实施不适用于后备传输。

简单案例场景:
1. 客户端连接到服务器 - 服务器将当前(完整)状态推送到该客户端
2. 服务器将当前状态的更改推送到所有连接的客户端

这是我认为很常见的情况。

我是如何为 websockets 做到的:

  1. 当客户端连接(GET)时,我将资源添加到默认广播器。该广播器用于向所有客户端发送数据(更改)。在相同的方法中,我为此资源创建了另一个广播器:
    Broadcaster privateBroadcaster = broadcasterFactory.lookup(DefaultBroadcaster.class, resource.uuid(), true);

  2. 客户端将数据推送到服务器。POST 方法被调用。这意味着:我是客户,我想要当前的完整状态。因此服务器获取原始资源 UUID,找到 privateBroadcaster,然后使用 privateBroadcaster 将完整状态推送到该客户端。

  3. 服务器使用默认的 boradcaster 将数据推送到所有客户端。除非客户端再次想要完整状态,否则不使用 privateBroacaster。

问题:
如果浏览器不支持 websockets(即 IE9、IE 8),此解决方案不适用于后备传输。此解决方案不起作用,因为方法 POST 中的原始资源与当前资源相同。所以不可能获得私人广播公司并将完整状态发送给客户端。

问题:

  1. 我的解决方案是否有机会进行一些修改?如果是这样,我应该改变什么。
    如果不
  2. 如何为这种情况制定解决方案?

我承认我现在迷路了,需要一些帮助。如果您需要更多详细信息,请询问。先感谢您。

--update
我决定将负责创建私有广播器的部分代码移至 POST 方法。该方法如下所示。负责创建响应的部分是无关紧要的,因此是隐藏的。这仍然适用于 webscokets,不适用于后备(长轮询)协议。客户端没有收到初始状态,收到了更改,但没有什么可更新的。

@Context AtmosphereResource resource;
@Context BroadcasterFactory broadcasterFactory;

@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public void sendCurrentState(Request request){

    logger.info("creating private broadcaster for uuid: " + resource.uuid());
    Broadcaster privateBroadcaster = broadcasterFactory.lookup(DefaultBroadcaster.class, resource.uuid(), true);
    privateBroadcaster.addAtmosphereResource(resource);
    //Prepare response (hidden)
    privateBroadcaster.broadcast(encodedJSON);
}

休伯特

4

1 回答 1

0

POST 中的 AtmosphereResource 不一样。长轮询和流式传输的 uuid 相同,但您需要使用AtmosphereResourceFactory.find(...).

让我们继续在邮件列表上进行讨论,以防万一它不起作用。

于 2013-05-01T21:39:41.373 回答