`

图解用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
分享到:
评论

相关推荐

    Java图解教程Java图解教程

    Java图解教程Java图解教程Java图解教程Java图解教程Java图解教程Java图解教程Java图解教程Java图解教程Java图解教程Java图解教程Java图解教程Java图解教程Java图解教程Java图解教程Java图解教程Java图解教程Java图解...

    图解算法小册-Java版

    ### 图解算法小册-Java版 #### 一、引言 随着计算机科学的发展,算法作为其中不可或缺的一部分,越来越受到人们的重视。《图解算法小册-Java版》旨在通过直观的方式,帮助读者理解并掌握各种算法的核心思想,无论你...

    微信小程序开发图解案例教程-源代码

    微信小程序开发图解案例教程-源代码微信小程序开发图解案例教程-源代码微信小程序开发图解案例教程-源代码微信小程序开发图解案例教程-源代码微信小程序开发图解案例教程-源代码微信小程序开发图解案例教程-源代码...

    图解java(4)

    图解java4 很好表达java语言与概念。

    java图解教程

    2. **Java环境配置**:学习Java前,你需要安装Java Development Kit (JDK),设置好环境变量`JAVA_HOME`、`PATH`和`CLASSPATH`,以便在命令行中使用Java编译器(javac)和Java虚拟机(JVM)。 3. **Java语法基础**:...

    经典中经典Java图解教程

    《经典中经典Java图解教程》是一份专为初学者和有一定基础的Java开发者设计的教育资源,通过图形化的解释方式,使得复杂的编程概念变得更为直观易懂。这份教程旨在帮助学习者深入理解Java语言的核心特性,提升编程...

    非常好的Java入门图解教程

    - **异常**:Java使用异常处理机制来捕获和处理程序运行时可能出现的问题。 - **try-catch-finally**:这三个关键字用于定义异常处理块,`try`中包含可能抛出异常的代码,`catch`用于捕获并处理异常,`finally`则...

    图解数据结构--使用Java

    全书内容浅显易懂,利用大量且丰富的图示与范例, 详解复杂的抽象理论,从最基本的数据结构概念开始 说明,再以Java工具加以诠释阵列结构、堆栈、链表 、队列、排序、查找等重要的概念,引领读者抓住重 点轻松进入...

    java教程之java程序编译运行图解(java程序运行)

    为了运行Java程序,需要使用java命令,后接类的全限定名(包含包路径)。继续上面的例子,如果要运行MyClass类,需要执行: ```bash java com.example.MyClass ``` 如果类名中包含包名,直接运行不加-d选项编译出...

    《微信小程序开发图解案例教程》教学教案—01认识微信小程序.pdf

    《微信小程序开发图解案例教程》教学教案—01认识微信小程序.pdf《微信小程序开发图解案例教程》教学教案—01认识微信小程序.pdf《微信小程序开发图解案例教程》教学教案—01认识微信小程序.pdf《微信小程序开发图解...

    图解JAVA PDF

    中文图解JAVA语言完整表达JAVA语言

    Java图解创意编程:从菜鸟到互联网大厂之路.pptx

    他通过实例来说明这些概念,并展示了如何使用Java编写面向对象的程序。他还介绍了一些常用的Java库和框架,例如Java Standard Edition(SE)和Spring Boot,这些工具可以大大简化Java编程的过程。 本书还介绍了Java...

    图解数据结构使用C++范例程序

    《图解数据结构使用C++范例程序》是一本深入浅出的数据结构学习资源,它以C++语言为工具,通过实例程序详细讲解了各种重要的数据结构及其应用。在这个压缩包中,你将找到一系列与数据结构相关的C++源代码,帮助你更...

    图解java设计模式_学习笔记_java开发

    在Java中,可以使用双重检查锁定(Double-Checked Locking)或静态内部类等方式实现。 2. **工厂方法模式**:定义一个用于创建对象的接口,让子类决定实例化哪一个类。这将实例化操作延迟到子类,增加了系统的灵活...

    java笔记图解15

    多线程则是Java的一大亮点,通过Thread类和Runnable接口可以创建并管理线程,实现并发执行,提高程序效率。网络编程涉及到Socket编程,Java提供了丰富的API来支持TCP和UDP通信。 综上所述,"java笔记图解15"很可能...

    java知识图解

    全面 详细 直观的Java基础点图解,涉及Java发展历史、开发环境配置、基础语法、 基本概念、面向对象、数据类型等

    Java网络程序设计

    本书概念性强,结构清晰,在论述中兼顾各类用户、不同的操作系统,并辅以大量的程序代码、图解及图表,同时提供大量的相关信息供读者参阅,是Java高阶编程人员的得力助手,也可作为从事Java程序开发的各类人员的参考...

    JAVA时间和日期图解.rar

    总的来说,这个"JAVA时间和日期图解"教程将帮助你掌握Java中处理日期和时间的最佳实践,理解新的`java.time`包的优势,以及如何在实际项目中有效地使用这些工具。通过学习,你将能够编写出更优雅、更易于维护的日期...

    bat文件调用java入门实例带图解

    通过上述步骤,我们成功地实现了使用bat文件调用Java程序来执行数据库的基本操作。这种方式不仅简化了程序的启动流程,还便于在生产环境中进行部署和维护。此外,这种方法还提供了一种灵活的方式来集成不同语言编写...

Global site tag (gtag.js) - Google Analytics