使用java-socket进行长轮询

时间:2015-08-06 08:04:57

标签: java sockets long-polling polling

我开发了一个基于java的客户端,它使用Java套接字连接到服务器。对于信息交换,我使用了http-Protocol。基本上,我通过套接字建立连接,我在客户端编写了一个方法,向服务器发出http请求。我连接的服务器是我自己开发的一个非常简单的服务器。我想问一下,是否可以通过套接字使用请求方法进行长轮询。

由于我的类客户端中有一个请求方法,因此我有两个选项: 连续请求:包括向每毫秒发送一个请求,询问是否发生了新事件。 延长请求(称为长轮询):客户端发送请求。如果有响应,服务器将回答。否则它将不会发送响应,请求将超时。那时客户端发送新请求

以下是我的模型的说明:

{{1}}

如何扩展我的计划?  如何使用可用的客户端和服务器实现长轮询?

1 个答案:

答案 0 :(得分:1)

我想说一个简单的解决方案(性能和左侧)你不需要做太多事情:你正在申请一个"事件"从服务器。服务器在循环中接受请求,并将每个请求的处理委托给另一个线程(请参阅java.util.concurrent.ExecutorService)。每个处理线程一直等到事件可用(您可以使用java.util.concurrent.BlockingQueue)并响应请求。如果配置了超时(请参阅Socket.setSoTimeout,可能根本没有超时)并且超时(抛出java.net.SocketTimeoutException),客户端可以关闭现有连接并再次连接。

出于稳定性原因,我会设置一些(长)超时,否则可能无法识别断开连接。

如果您有许多客户端,请考虑在服务器上使用非阻塞IO。使用传统的ServerSocket,每个客户端都会阻塞一个线程。如果这不是问题,请坚持使用ServerSocket,因为它不那么复杂和直观。

如果您不想重新发明轮子,请查看HTTP部件的Jetty或类似库。您仍然可以使用相同的结构,但不是简单的二进制流,而是获得一个不错的HttpRequest

相关问题