使用 java-sockets 进行长轮询

long polling using java-sockets

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

因为我的 class 客户端有一个请求方法,所以我有两个选项: 连续请求: 包括每毫秒发送一个请求,询问是否有新事件发生。 长时间请求(称为长轮询):客户端发送请求。如果有响应,服务器将回答。否则它不会发送响应并且请求将超时。当时客户端发送了一个新的请求

这是我的模型的描述:

I wrote a simple http-client and a simple http-server. 
*The client has a method request 
* the server has a method respond.
*The client send a get-request by using its request-method to my server (gives back a command to the client)
**That server reponds to this request using its respond-method.  

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

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

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

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

如果你不想重新发明轮子,看看Jetty or similar libraries for the HTTP part. You can still have the same structure, but instead of a plain binary stream you get a nice HttpRequest