Comet、Tomcat 和 READ 事件

发布于 2024-08-06 07:09:15 字数 1160 浏览 2 评论 0原文

尝试使用 Java servlet 来实现 Comet 时,我遇到了一个大问题:似乎没有办法使用已建立的到客户端的连接从浏览器向服务器发送附加数据(在写入输入流时可以在纯 java 中工作) )。

当客户端连接到 servlet、接收用于发送输入的表单和用于呈现服务器输出的表单时,CometChat 应用程序会出现以下问题: 现在,如果客户端想要在此连接上发送一些数据,则会在 servlet 上产生 READ 事件,这怎么办?

我尝试发送 GET、HEAD 和 POST。使用 HEAD 后,彗星连接将被关闭。 GET 总是产生 END、BEGIN,POST 总是产生 BEGIN、READ。

我尝试在网上搜索,但我找到的唯一答案是:当存在带有主体的 POST 方法时,Comet READ events are generated

我怎样才能实现这一点?

我正在使用普通的 Javascript Ajax:

function send(content) {
   var text = document.controller.input.value;
   params = 'input=' + content;
   var ajaxObj = createXMLHttp();
   ajaxObj.open('POST', 'CometChat', true);
   ajaxObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
   ajaxObj.setRequestHeader('Content-Length', params.length); 
   ajaxObj.setRequestHeader('Connection', 'close');
   ajaxObj.onreadystatechange = function() {};
   ajaxObj.send(params);
}

这会生成 BEGIN,READ。我需要设置哪些标头才能仅生成 READ 事件?

我可以通过查找连接并重用响应来“欺骗”这一点,但在客户端,AJAX 请求保持交互模式(尽管在服务器上刷新它),并且我只能在 FF 上发送 5 个请求在 IE 上有 10 个请求之后,后面的请求不会被处理。此外,一旦服务器收到第一个 AJAX 请求,我就会收到 TIMEOUT 事件,每个请求有两个永远重复。

真正的方法是什么?

Trying to get my way trought Comet with Java servlets, I encountered a big problem: There seems to be no way to use the established connection to the client to send the server additional data from the browser (works in plain java when writing to the inputstream).

Following problem arises for a CometChat application when a Client connects to servlet, receives a form for sending input and a form for presenting server output: Now if the client wants to send some data at this connection, resulting in a READ event at the servlet, how can this be done?

I tried sending GET, HEAD and POST. With HEAD the comet connection is closed afterwards. GET always produces END, BEGIN and POST produces BEGIN, READ.

I tried searching the web, but the only answer I found was: Comet READ events are generating when there is a POST method with a body

How can I achieve this?

I'm using plain Javascript Ajax:

function send(content) {
   var text = document.controller.input.value;
   params = 'input=' + content;
   var ajaxObj = createXMLHttp();
   ajaxObj.open('POST', 'CometChat', true);
   ajaxObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
   ajaxObj.setRequestHeader('Content-Length', params.length); 
   ajaxObj.setRequestHeader('Connection', 'close');
   ajaxObj.onreadystatechange = function() {};
   ajaxObj.send(params);
}

This produces BEGIN, READ. What headers do I need to set to produce a solely READ event only?

I'm able to 'cheat' this by looking up my connections and reuse response, but on client side, the AJAX request stays in interactive mode (although flushing it on the server) and I'm only able to may 5 requests on FF and 10 requests on IE before the following request is not processed. Also as soon as the first AJAX request is received on the server, I'm get TIMEOUT events, two per request repeating forever.

What's the real way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧情别恋 2024-08-13 07:09:16

祝你好运,使用 Java Servlet 创建 Comet 应用程序是一项相当复杂的任务。另外,Tomcat 并不是真正为此而设计的。我建议您查看StreamHub Comet Server

Good luck, creating a Comet app with Java Servlets is a pretty complicated undertaking. Plus Tomcat wasn't really designed for it. I suggest you check out StreamHub Comet Server.

时常饿 2024-08-13 07:09:16

正如 rajax 所说,在 servlet 中开发 Comet 应用程序是一个非常糟糕的主意。

As rajax says, developing a Comet app in servlets is a really bad idea.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文