`

图解用Java实现的https心跳程序

阅读更多

本文以图示的方式简单介绍了如何使用Java来实现心跳程序,心跳的英文单词是heartbeat. 心跳的目的是当客户端第一次向服务器端发送了请求后,在一定时间内服务器端未能将响应返回到客户端,那么客户端为了继续保持和服务器端的连接,这时客户端就会发送一个心跳到服务器端来维持这种连接,我个人的理解心跳其实也是一种请求,只不过这个请求并不携带要求服务器端要进行处理的信息(个人看法,仅供参考)。

 

好了,下面我就把客户端和服务器端的程序共享出来供大家参考。说明一下,我采用的是https响应方式,所以我会把详细的步骤呈现出来。我的操作系统是英文的,大家就将就着看吧,不过有截图,看起来也很方便啦!

 

1. 创建https服务器端所需要的证书。https是一种安全链接协议,所以在服务器端需要一个证书,关于这方面的知识大家可以去参考更为专业和详细的介绍,在这里就简单跳过了。

1.1. startrun

 

1.2. 在下列界面中输入cmd, 点击Ok

 

 

1.3. 输入创建证书的命令(Windows和Unix系统都适用) keytool -genkey -alias test -keyalg RSA -keystore D:/mykey.store, 这样就会在D:\下创建一个名为mykey.store的证书

 

 

 

 

说明:红框里面的都是要自己输入的,关键是密码,服务器端程序要使用到。

 

2. 服务器端程序

模式很固定,至于为什么要写成这样,you ask me, I ask whom, youd better ask Google. 业务逻辑在class MyHandlerpublic void handle(HttpExchange t) throws IOException中实现。另外实现这个服务器端程序要用到 这是MyEclipse自带的,JDK1.6

import java.io.BufferedReader;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

 

import java.net.InetSocketAddress;

 

 

import java.security.KeyManagementException;

import java.security.KeyStore;

import java.security.KeyStoreException;

import java.security.NoSuchAlgorithmException;

import java.security.UnrecoverableKeyException;

import java.security.cert.CertificateException;

 

 

import javax.net.ssl.KeyManagerFactory;

import javax.net.ssl.SSLContext;

 

import sun.net.httpserver.HttpsServerImpl;

 

import com.sun.net.httpserver.HttpExchange;

import com.sun.net.httpserver.HttpHandler;

import com.sun.net.httpserver.HttpsConfigurator;

 

publicclass HttpsServer {

   publicstaticvoid main(String[] args) {

      com.sun.net.httpserver.HttpsServer hss;

      try {

         //Set port as 8000

         hss = HttpsServerImpl.create(new InetSocketAddress(8000),0);

          

         //Create certification lib

         KeyStore ks = KeyStore.getInstance("JKS");

         // Load certification

         ks.load(new FileInputStream("D:/key.store" ), "123456".toCharArray());

         //Create a KeyManageeFactory

         KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");

         //Initialize the KeyManageeFactory

         kmf.init(ks, "123456".toCharArray());

         //Create certification instance

         SSLContext sslContext = SSLContext.getInstance("SSLv3");

         //Initialize certification

         sslContext.init(kmf.getKeyManagers(), null, null);

         //Confighttps

         HttpsConfigurator conf = new HttpsConfigurator(sslContext);

          

         //Load configuration in https server

         hss.setHttpsConfigurator(conf);

         // creates a default executor

         hss.setExecutor(null);

         // apply MyHandler to process "/" request

          

         hss.createContext("/mytest", new MyHandler());

          

         hss.start();

          

      } catch (IOException e) {

         e.printStackTrace();

      } catch (KeyStoreException e) {

         e.printStackTrace();

      } catch (NoSuchAlgorithmException e) {

         e.printStackTrace();

      } catch (CertificateException e) {

         e.printStackTrace();

      } catch (UnrecoverableKeyException e) {

         e.printStackTrace();

      } catch (KeyManagementException e) {

         e.printStackTrace();

      }

   }

}

 

 

class MyHandler implements HttpHandler{

   privateintcount;

   publicvoid handle(HttpExchange t) throws IOException {

       

      InputStream is = t.getRequestBody();

      BufferedReader br = new BufferedReader(new InputStreamReader(is));

      String msg = null;

      while ((msg = br.readLine()) != null) {

         System.out.println("Request from client: " + msg);         

      }

      is.close();

      br.close();

       

      count ++;

      System.out.println("count: " + count);

      String response1 = "first";

      String response2 = "second";

      t.sendResponseHeaders(200, 200);

       

      OutputStream os = t.getResponseBody();

      try {

         if (count == 1) {

            System.out.println("First send response to client");

            Thread.sleep(6000);

            os.write(response1.getBytes());

         } elseif (count == 2){

            System.out.println("Second send response to client");

//            Thread.sleep(6000);

            Thread.sleep(2000);

            os.write(response2.getBytes());

         }

          

      } catch (InterruptedException e) {

         e.printStackTrace();

      }   

      os.flush();

      os.close();

   }

}

 

3. 客户端程序

如果把本机作为服务器,url中的服务器地址理论上可以写成实际IP或127.0.0.1或localhost, 但有时写成实际的IP, 程序会出问题,就不得不写成127.0.0.1或localhost, 至于原因嘛,you ask me, I ask whom, youd better ask Google, 因为我就是个打酱油的。多看我写的注释,关键代码就是那一句啊

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.net.MalformedURLException;

import java.net.URL;

import java.security.GeneralSecurityException;

import java.security.cert.X509Certificate;

 

import javax.net.ssl.HostnameVerifier;

import javax.net.ssl.HttpsURLConnection;

import javax.net.ssl.SSLContext;

import javax.net.ssl.SSLSession;

import javax.net.ssl.X509TrustManager;

 

 

publicclass HttpsClient {

   privatestatic String url = "https://127.0.0.1:8000/mytest";

   private myX509TrustManager xtm = new myX509TrustManager();

   private myHostnameVerifier hnv = new myHostnameVerifier();

 

   public HttpsClient() {

      SSLContext sslContext = null;

      try {

         sslContext = SSLContext.getInstance("TLS"); // 或SSL

         X509TrustManager[] xtmArray = new X509TrustManager[] { xtm };

         sslContext.init(null, xtmArray, new java.security.SecureRandom());

      } catch (GeneralSecurityException e) {

         e.printStackTrace();

      }

      if (sslContext != null) {

         HttpsURLConnection.setDefaultSSLSocketFactory(sslContext

               .getSocketFactory());

      }

      HttpsURLConnection.setDefaultHostnameVerifier(hnv);

   }

    

   privateintcount = 0;

   publicvoid send(String msg) {

      count ++;

      HttpsURLConnection urlCon = null;

      OutputStream os = null;;

      InputStream is = null;

      BufferedReader br = null;

      try {

         urlCon = (HttpsURLConnection) new URL(url).openConnection();

         urlCon.setDoOutput(true);

         urlCon.setRequestProperty("Content-Length", "1024");

         urlCon.setUseCaches(false);

         urlCon.setDoInput(true);

         urlCon.setRequestMethod("POST");

//         key point, set response time.

         urlCon.setReadTimeout(5000);

          

         os = urlCon.getOutputStream();

          

         os.write(msg.getBytes());

         os.flush();

         os.close();

          

         is = urlCon.getInputStream();

         br = new BufferedReader(new InputStreamReader(is));

         String line = null;

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

            System.out.println("Response from server: " + line);

            System.exit(0);

         }

      } catch (MalformedURLException e) {

         e.printStackTrace();

      } catch (IOException e) {

          

         if (count == 1) {

            System.out.println("Send heartbeat");

            send("Heartbeat");

         } elseif (count == 2) {

            System.out.println("Time is up");

         }

      } finally {

         urlCon.disconnect();

         try {

            os.close();

            is.close();

            br.close();

         } catch (IOException e) {}

      }

   }

    

   publicstaticvoid main(String[] args) {

      HttpsClient t = new HttpsClient();

      System.out.println("Send request to server");

//      try {

//         Thread.sleep(6000);

         t.send("Hello Server");

//      } catch (InterruptedException e) {

//         e.printStackTrace();

//      }

   }

    

   class myX509TrustManager implements X509TrustManager {

      publicvoid checkClientTrusted(X509Certificate[] chain, String authType) {}

      publicvoid checkServerTrusted(X509Certificate[] chain, String authType) {}

      public X509Certificate[] getAcceptedIssuers() {

         returnnull;

      }

   }

 

   class myHostnameVerifier implements HostnameVerifier {

      publicboolean verify(String hostname, SSLSession session) {

         returntrue;

      }

   }

}

 

 

 

 

  • 大小: 107.5 KB
分享到:
评论

相关推荐

    springCloud服务注册Eureka实现过程图解

    Spring Cloud 服务注册 Eureka 实现过程图解 Eureka 是 Netflix 开发的一个基于 REST 服务的服务注册和发现组件。主要包括两个组件:Eureka Server 和 Eureka Client。Eureka Server 是注册中心,提供服务注册和...

    Spring Cloud搭建eureka过程图解

    5. 使用 @EnableDiscoveryClient 注解使得应用程序变成 Eureka 客户端。 6. Eureka Server 的配置信息包括服务注册地址、服务发现地址、心跳检测间隔时间等。 7. Eureka 客户端的配置信息包括服务注册地址、服务发现...

    通俗易懂的Netty从入门到源码剖析教程

    Netty是当前非常流行的网络通讯框架,当程序对网络数据处理时,需要保证高并发和高可靠,底层就可以用Netty支撑。本套课程详细讲解了Netty核心技术点,同时进行底层机制和源码剖析,并编写了大量的应用实例。通过...

    《基于YOLOv8的八段锦练习指导系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    大语言模型教育应用中的知识冲突挑战与应对策略

    内容概要:本文详细探讨了大语言模型(LLMs)在教育应用中遇到的知识冲突问题,包括概念定义、事实陈述和逻辑推理层面的认知不一致性。文章分析了知识冲突的技术成因,如训练数据噪声、参数化知识表示的局限、推理机制的缺陷、模型架构的不足及外部知识的偏差,并探讨了这些因素对教育应用的深远影响。文中提出了多维度的解决路径,如通过数据增强优化知识表示、利用提示强化上下文连贯、开发量规完善模型评估等。此外,文章从社会文化的宏观视角剖析了知识冲突的外部驱动因素,探讨如何在多元异质、动态演进的社会建构语境中构建开放进取、兼容融通的智能教育应用体系。 适合人群:从事教育技术研究的学者、教育工作者、人工智能研究人员和技术开发者。 使用场景及目标:①帮助教育工作者理解大语言模型在教育应用中的局限性;②为技术人员提供优化大语言模型教育应用的具体策略;③促进教育人工智能技术的可靠性、适应性和普及性提升。 其他说明:文章强调了知识冲突的有效化解不仅能够提升大语言模型在教育场景中的应用价值,还将为人工智能在更广泛领域的可持续发展奠定坚实基础。

    《基于YOLOv8的家具鉴定系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    数据结构day1-思维导图顺序表

    数据结构day1-思维导图顺序表

    STM32超声波红外避障小车

    STM32超声波红外避障小车项目通过STM32微控制器实现自动避障功能。硬件部分主要包括STM32开发板、超声波传感器、红外传感器、直流电机、电池模块和电机驱动模块。超声波传感器用于测量前方障碍物的距离,红外传感器帮助小车检测地面线路或障碍物。电机驱动模块通过STM32控制直流电机的转动,从而实现小车的前进、后退和转向。 在软件方面,STM32通过编写简单的避障算法,实时读取传感器数据,并根据环境信息控制小车的运动。当超声波传感器检测到障碍物时,系统会触发后退或转向操作,避免碰撞。

    哈尔滨工业大学DeepSeek公开课-从图灵测试到DeepSeek.pdf

    哈尔滨工业大学DeepSeek公开课-从图灵测试到DeepSeek.pdf

    《基于YOLOv8的冰上运动监测系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    《基于YOLOv8的体育产业监测系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    《基于YOLOv8的港口机械识别系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    oooooomy_vchat_1742859071.zip

    app开发

    《基于YOLOv8的3D打印缺陷检测系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    Screenshot_2025-03-31-19-36-01-657_com.UCMobile.jpg

    Screenshot_2025-03-31-19-36-01-657_com.UCMobile.jpg

    半导体过程控制篇 集成电路的可靠性仿真_03_31_153111.docx

    半导体过程控制篇 集成电路的可靠性仿真_03_31_153111.docx

    社交应用_鸿蒙OS_API12_高仿微信APP_开发示例_1742847098.zip

    社交应用_鸿蒙OS_API12_高仿微信APP_开发示例_1742847098.zip

    《基于YOLOv8的民间体育监测系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    安卓_热更新_简化编译_HTHotFix框架_1742849446.zip

    app开发

    2024 最新版智慧消防全流程解决方案(含 BIM+IoT 技术应用 + 典型案例分析)

    2024 最新版智慧消防全流程解决方案(含 BIM+IoT 技术应用 + 典型案例分析)

Global site tag (gtag.js) - Google Analytics