长轮询的使用实现_长轮询和短轮询

长轮询的使用实现_长轮询和短轮询轮询(Polling):是指不管服务器端有没有更新,客户端(通常是指浏览器)都定时的发送请求进行查询,轮询的结果可能是服务器端有新的更新过来,也可能什么也没有,只是返回个空的信息。不管结果如何,客户端处理完后到下一个定时时间点将继续下一轮的轮询。长轮询(LongPolling):长轮询的服务其客户端是不做轮询的,客户端在发起一次请求后立即挂起,一直到服务器端有更新的时候,服务器才会主动推送信息到…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

轮询(Polling):是指不管服务器端有没有更新,客户端(通常是指浏览器)都定时的发送请求进行查询,轮询的结果可能是服务器端有新的更新过来,也可能什么也没有,只是返回个空的信息。不管结果如何,客户端处理完后到下一个定时时间点将继续下一轮的轮询。

长轮询(Long Polling):长轮询的服务其客户端是不做轮询的,客户端在发起一次请求后立即挂起,一直到服务器端有更新的时候,服务器才会主动推送信息到客户端。 在服务器端有更新并推送信息过来之前这个周期内,客户端不会有新的多余的请求发生,服务器端对此客户端也啥都不用干,只保留最基本的连接信息,一旦服务器有更新将推送给客户端,客户端将相应的做出处理,处理完后再重新发起下一轮请求。

可见,长轮询的特点:

服务器端会阻塞请求直到有数据传递或超时才返回.

客户端响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接.

当客户端处理接收的数据、重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。

Java-长轮询(Long polling)实现

服务端

package _20200418.example;

import com.sun.net.httpserver.HttpServer;

import java.io.IOException;

import java.io.OutputStream;

import java.net.InetSocketAddress;

import java.nio.charset.StandardCharsets;

import java.util.Random;

import java.util.concurrent.Executors;

import java.util.concurrent.TimeUnit;

import java.util.concurrent.atomic.AtomicLong;

/**

* 长轮询服务端

*

* Created by zfh on 2020/04/18

*/

public class server {

private final AtomicLong value = new AtomicLong();

private void start() throws IOException {

HttpServer httpServer = HttpServer.create(new InetSocketAddress(8080), 0);

httpServer.setExecutor(Executors.newCachedThreadPool());

httpServer.createContext(“/long-polling”, httpExchange -> {

byte[] data = fetchData();

httpExchange.sendResponseHeaders(200, data.length);

OutputStream outputStream = httpExchange.getResponseBody();

outputStream.write(data);

outputStream.close();

httpExchange.close();

});

httpServer.start();

}

private byte[] fetchData() {

try {

// 由于客户端设置的超时时间是50s,

// 为了更好的展示长轮询,这边random 100,模拟服务端hold住大于50和小于50的情况。

Random random = new Random();

TimeUnit.SECONDS.sleep(random.nextInt(100));

} catch (InterruptedException ignored) {

}

return Long.toString(value.getAndIncrement()).getBytes(StandardCharsets.UTF_8);

}

public static void main(String[] args) throws IOException {

server server = new server();

server.start();

}

}

客户端

package _20200418.example;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

import java.nio.charset.StandardCharsets;

import java.util.concurrent.atomic.AtomicLong;

/**

* 长轮询-客户端

*

* Created by zfh on 2020/04/18

*/

public class client {

private static final String SYNC_URL = “http://localhost:8080/long-polling”;

private final AtomicLong sequence = new AtomicLong();

void poll() {

// 循环执行,保证每次longpolling结束,再次发起longpolling

// 结束条件,超时或者拿到数据

while (!Thread.interrupted()) {

doPoll();

}

}

private void doPoll() {

System.out.println(“第” + (sequence.incrementAndGet()) + “次 longpolling”);

long startMillis = System.currentTimeMillis();

HttpURLConnection connection = null;

try {

URL getUrl = new URL(SYNC_URL);

connection = (HttpURLConnection) getUrl.openConnection();

// 50s作为长轮询超时时间

connection.setReadTimeout(50000);

connection.setConnectTimeout(3000);

connection.setRequestMethod(“GET”);

connection.setUseCaches(false);

connection.setDoOutput(true);

connection.setDoInput(true);

connection.setRequestProperty(“Content-Type”, “application/json;charset=UTF-8”);

connection.setRequestProperty(“Accept-Charset”, “application/json;charset=UTF-8”);

connection.connect();

if (200 == connection.getResponseCode()) {

BufferedReader reader = null;

try {

reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));

StringBuilder result = new StringBuilder(256);

String line;

while ((line = reader.readLine()) != null) {

result.append(line);

}

System.out.println(“结果 ” + result);

} finally {

if (reader != null) {

reader.close();

}

}

}

} catch (IOException e) {

System.out.println(“request failed”);

} finally {

long elapsed = (System.currentTimeMillis() – startMillis) / 1000;

System.out.println(“connection close” + ” ” + “elapse ” + elapsed + “s”);

if (connection != null) {

connection.disconnect();

}

System.out.println();

}

}

public static void main(String[] args) throws InterruptedException {

client bootstrap = new client();

bootstrap.poll();

Thread.sleep(Integer.MAX_VALUE);

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/230792.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 老给力的网址

    老给力的网址http://blog.csdn.net/elimago/archive/2009/02/26/3938842.aspx转载于:https://www.cnblogs.com/diyunpeng/archive/2011/06/30/2094232.html

  • linux修改文件名字_linux搜索文件名命令

    linux修改文件名字_linux搜索文件名命令在Linux环境下修改文件名可以有不同的命令方式,比如rename、mv都可以进行修改,如果用户正在了解这方面的知识,可以阅读下文了解Linux修改文件名以及批量修改文件名的方法。对于单个的文件,可以直接使用命令,那如果有大量的类似格式的文件名需要修改成其他格式的,该如何呢?比如某次测试后,保存的文件为Lan1.txt,Lan2.txt,……Lan100.txt这一百个文件需要在前面添加前缀变成…

    2022年10月24日
  • 串行通信(USART/UART)「建议收藏」

    串行通信(USART/UART)「建议收藏」USART支持同步模式,因此USART需要同步始终信号USART_CK(如STM32单片机),通常情况同步信号很少使用,因此一般的单片机UART和USART使用方式是一样的,都使用异步模式。UART作为串口的一种,其工作原理也是将数据一位一位的进行传输,发送和接收各用一条线,因此通过UART接口与外界相连最少只需要三条线:TXD(发送)、RXD(接收)和GND(地线)**空闲位:**数据线在空闲状态的时候为逻辑“1”状态,也就是高电平,表示没有数据线空闲,没有数据传输。**起始位:**.

  • navigator.appName

    navigator.appName找了很多的参考,无外乎两句话,兼容性和缅怀网景我就很好奇,到底在兼容什么然后翻到一篇外文的提问,里面提及了DOM0然后去了解了一下DOM0…看了介绍之后,就是不太推荐使用的标签监听属性on事件名,不过这文章有提到DOM0具有极好的跨浏览器优势,所以可能appName就是在这方面的支持吧,如果有知道的大佬请留个言,解释一下吧,老纠结了….

  • 简单工厂和策略模式_21680002工厂模式

    简单工厂和策略模式_21680002工厂模式简单工厂加策略模式的应用

  • java tess4j 示例_java 使用tess4j实现OCR的最简单样例[通俗易懂]

    java tess4j 示例_java 使用tess4j实现OCR的最简单样例[通俗易懂]网上很多教程没有介绍清楚tessdata的位置,以及怎么配置,并且对中文库的描述也存在问题,这里介绍一个最简单的样例。1、使用maven,直接引入依赖,确保你的工程JDK是1.8以上net.sourceforge.tess4jtess4j4.3.12、实现代码publicclassOCRDemo{publicstaticvoidmain(Stringargs[])throwsExce…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号