Atmosphere jQuery responseBody 总是以长度管道“5|”开头

Atmosphere jQuery responseBody always starts with length pipe "5|"

我正在尝试使用大气框架。 发送和接收数据工作得很好,但我认为 jquery 读取收到的消息时存在一些不兼容或其他问题:

当服务器发回 "Text" 时,就像在我的 TestService.java 代码中一样,jQuery-客户端收到一个 responseBody“4|Text”(=> 文本长度|文本)。当然,我可以去掉数字和管道,但我想首先找出问题所在。

因此,当我首先加载 html 页面时,我收到一条提示,仅显示“|”。然后,每次我单击发送按钮时,我都会收到一个警报“4|文本”。有时在 2 分钟超时后我什至会收到警报“1|X”。

atmosphere-runtime version is: 2.2.7
jQuery-Version is: 2.1.4
jquery.atmosphere-version is: 2.2.7-jquery from https://github.com/Atmosphere/atmosphere-javascript

我也试过其他版本的组合,但都没有解决问题。

我在 Glassfish 上遇到了同样的问题,但目前我使用的是 WildFly 8.1。 Opera、Firefox 和 Chromium 的问题是一样的。

我的 TestService class 看起来像这样,我认为它工作正常:

@ManagedService(path="/")
public class TestService {

private final Logger logger = LoggerFactory.getLogger(TestService.class);

@Ready
public void onReady(AtmosphereResource r) {
    logger.info("Resource {} connected", r.uuid());
}

@Message(decoders = {JacksonDecoder.class})
public String onMessage(AtmosphereResource r, Test t) throws IOException {
    logger.info("Message received = " + t.toString());
    return "Text";
}   
}

在 jQuery 客户端上发送和接收的代码如下所示:

var socket = $.atmosphere;
var usersUpdateReq = {
    url: '/NewQuiz-web/quiz',
    transport: 'websocket',
    fallbackTransport: 'long-polling',
    contentType: "application/javascript"
};
usersUpdateReq.onMessage = function(resp) {
    if(resp.status === 200) {
    alert("received: >>" + resp.responseBody + "<<");
    console.log(resp.responseBody);
    eval(resp.responseBody);
    }
};
usersUpdateReq.onError = function(resp) {
    alert('Error');
    console.log(resp);
};

var usersUpdateSubSock = socket.subscribe(usersUpdateReq);

发送示例请求:

$("#sendb").click(function() {
    usersUpdateSubSock.push($.stringifyJSON({ name : "TestTest" }));
});

如果您需要更多信息,请告诉我。谢谢大家!

这两种行为都是预期的。

第一个(像 4|text 这样的字符串)是跟踪您的回复的长度(查看更多信息 here)。这样客户端将验证收到的响应内容是否完整。但是,要完全配置它,您需要将以下 属性 添加到 client 端的 request 对象(在您的情况下 usersUpdateReq):

trackMessageLength : true

第二个(像1|X这样的字符串)代表心跳,保持服务器和客户端之间的连接。查看更多信息 here. And of course you can configure it in the server and client side