使用java sockets的长轮询



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

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

这是我的模型的描述:

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.  

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

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

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

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

如果你不想重新发明轮子,看看Jetty或类似的HTTP部分库。您仍然可以使用相同的结构,但不是普通的二进制流,而是得到一个很好的HttpRequest。

相关内容

  • 没有找到相关文章

最新更新