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

长轮询的使用实现_长轮询和短轮询轮询(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)


相关推荐

  • ROS安装教程|从零开始[通俗易懂]

    ROS安装教程|从零开始[通俗易懂]前两天把自己的ROS搞坏了,不知道咋修复了,只好重装一次。想到大家可能还有从来没接触过ROS的,不知道怎么安装,我就记录一下这次的重装过程安装VMware,这个我已经装了,就不细说了,管家公众号上有安装教程 下载ubuntu镜像文件Indexof/ubuntu-releases/18.04.6/|清华大学开源软件镜像站|TsinghuaOpenSourceMirrorIndexof/ubuntu-releases/18.04.6/|清华大学开源软件镜像站,致力于为国内和校

  • asp.net core 关于自增长ID数据保护(IDOR漏洞)[通俗易懂]

    asp.net core 关于自增长ID数据保护(IDOR漏洞)[通俗易懂]开始前先大概的描述下IDOR漏洞是啥。嗯!举个例子,有一个角色下面有N个用户,拥有这个角色的用户都有自身创建的普通用户操作权限(比如删除)。我们一般情况都是通过表主键来操作这条记录的,那么这么一个功能就涉及到两个接口(查询列表,删除指定用户)。嗯!查询列表的接口自然是要带着用户对应的主键的(通过删除接口传入ID),聪明的人应该想到了;此时ID是明文的并且主键我们一般都是自增长的,此时就会出现我们可以通过猜测这个参数进行恶意删除。嗯!此时有些人可能会想(也是几种解决方式):我可以通过对参数进行加密签名来

  • Java三大版本「建议收藏」

    Java三大版本「建议收藏」Java三大版本​ Java三大版本代表着Java技术的三个应用领域:JavaSE、JavaME、JavaEE。​ Java以前很长一段时间被称为Java2,所以现在很多人习惯称为J2SE、J2ME、J2EE,它们表示的含义是一样的。JavaSE​ JavaSE,它是JAVA的标准版,是整个JAVA的基础和核心,也是JavaEE和JavaME技术的基础,主要用于开发桌面应用程序。JavaME​ JavaME,它叫做Java的微缩版,主要应用于嵌入式开发,比如手机程序的开发。JavaEE

  • redis HSCAN命令及jedis的hscan方法[通俗易懂]

    redis HSCAN命令及jedis的hscan方法[通俗易懂]参考文档:http://doc.redisfans.com/key/scan.html@Override publicScanResultshscanToResltByVague(Stringkey,Stringpattern,Stringcursor,intpageSize){ List<Map.Entry<String,String>>result=null; List<Map.Entry<String,String&

    2022年10月31日
  • PyCharm激活码永久有效PyCharm2021.1.3激活码教程-持续更新,一步到位

    PyCharm激活码永久有效PyCharm2021.1.3激活码教程-持续更新,一步到位PyCharm激活码永久有效2021.1.3激活码教程-Windows版永久激活-持续更新,Idea激活码2021.1.3成功激活

  • 免费的ssl证书申请_公需课怎么申请证书

    免费的ssl证书申请_公需课怎么申请证书第一步:在阿里云上申请免费的https证书先点击Symantec然后选择1个域名然后选择免费型DVSSL第二步:我的订单页面完成信息的补全第三步:点击详情查看DNS信息,并且配置DNS信息第四步:下载证书,上传到nginx服务器第五步:配置nginx代理,并重启nginx服务第六步:访问https的接口或者页面,查看是否配置正确。

发表回复

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

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