如何使用servlet实现从服务器到客户端的中断驱动通信?

时间:2010-07-17 21:32:17

标签: google-app-engine web-applications servlets client-server

我们在C ++中根据发送屏幕截图写了screen sharing application

它通过在服务器和客户端之间建立TCP连接来工作,其中服务器通过连接转发为用户接收的每个新屏幕截图,并且由客户端弹出。

现在,我们正试图在谷歌应用引擎上托管这个,因此需要'servlet'-ize和'沙盒'服务器代码,以便通过HTTP请求实现这种转发。

我想象以下内容: 1.使用屏幕截图作为多数据表单发布请求(apache uploads ..)。 但现在服务器需要联系指定的客户端(谁登录)发送/转发屏幕截图。 我不确定如何'启动'从servlet到客户端的这种连接。客户端不运行任何servlet环境(当然)。 我知道HTTP 1.1支持TCP连接,但似乎gapps不允许我使用它。

我想到的一种方法是在登录时向每个登录用户发送CONTINUE 100,并在屏幕截图到达后进行响应。收到后,客户提出另一个请求,依此类推。 另一种方法(从设置浏览器的刷新标题开始)将定期(每5秒)拥有一个应用程序池。

3 个答案:

答案 0 :(得分:1)

你无法在GAE上有效地做到这一点。

问题1:All output is buffered until your handler returns

问题2:Quotas & Limits:

  

某些功能强加了无关的限制   配额,以保护稳定   系统。例如,当一个   调用应用程序来提供Web服务   请求,它必须发出响应   在30秒内。如果申请   这个过程需要太长时间   终止,服务器返回   错误代码给用户。请求   超时是动态的,可能是   如果请求处理程序到达,则缩短   它的超时常常是为了保存   资源。

Comet支持位于product roadmap,但对我而言,您的应用似乎仍然不适合GAE应用。

答案 1 :(得分:0)

长轮询是用于服务器和客户端之间的此类异步通信的概念。 在Long Polling中,servlet保存客户端和相关消息的映射。 Map的关键是客户端ID和值是要发送到客户端的消息列表。当客户端打开与服务器的连接(向servlet发送请求)时,如果有任何消息要发送给它,则servlet会检查Map。如果找到,它会将消息发送到客户端退出方法。在接收消息时,客户端将打开与服务器的新连接。如果servlet没有找到给定客户端的任何消息,它会等到Map更新给定客户端的消息。

答案 2 :(得分:0)

我知道,这是一个迟到的回复,但我相信Google可以满足这一要求:the Channel API

相关问题