网络编程

1.1概述

计算机网络:

计算机网络是指将地理位置不同的具有独立功能的多台计算机以及外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

网络编程的目的:

无线电台….传播交流信息,数据交换。通信

想要达到这个效果需要什么:

1.如何准确的定位网络上的一台主机 192.168.16.1: 端口,定位到这个计算机上的某个资源

2.找到了这个主机,如何创数数据?

java web: 网页编程 B/S

java 网络编程:TCP/IP C/S

1.2网络通信的要素

如何实现网络的通信?

通信双方地址:

  • ip
  • 端口号
  • 192.168.16.124;5900

规则:网络通信的协议

TCP/IP参考模型:

image-20210714160222275

小结:

​ 1.网络编程中主要有两个主要的问题

    • 如何准确的定位到网络上的一台或者多台主机;定位主机上的特定应用
    • 找到主机之后如何进行通信

    2.网络编程中的因素

    • IP 和 端口号 ip
    • 网络通信协议 udp,tcp

    3.万物皆对象

1.3 Inet Adderss

ip地址:InetAddress

  • 唯一定位一台网络上的计算机

  • 172.16.47.121 : 本机的localhost cmd--config\all``查看本机 ip

  • ip地址的分类

    • ipv4 / ipv6

      • IPV4 127.0.0.1 ,四个字节组成。 ,0-255,42亿~; 30亿在北美,亚洲4亿,2011年就 用完了。

      • IPV6 : 128位 8个无符号整数 ! (abcde)

        2001:0bb2:aaaa:0000:0000:1222:13a2:1111
        
    • 公网 (互联网) –私网 (局域网)

      • ABCD类地址
      • 192.168.开头的就是私有地址,范围即为 192.168.0.0 ~ 192.168.255.255,专门为组织机构 内部使用
  • 域名:记忆IP问题 !

    • IP : www.baidu.com — 112.80.248.75
    • 域名 = ip

InetAddress类

package com.Java网络编程;

import java.net.InetAddress;
import java.net.UnknownHostException;

//测试IP
public class class1 {
    public static void main(String[] args) {
        try {
            //查询本地ip地址
            InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
            System.out.println(inetAddress1);
            InetAddress inetAddress3 = InetAddress.getByName("localhost");
            System.out.println(inetAddress3);
            InetAddress inetAddress4 = InetAddress.getLocalHost();
            System.out.println(inetAddress4);

            //查询网站ip地址
            InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");
            System.out.println(inetAddress2);

            //常用方法
            // System.out.println(inetAddress2.getAddress());
            System.out.println(inetAddress2.getCanonicalHostName());//规范的名字
            System.out.println(inetAddress2.getHostAddress());//ip
            System.out.println(inetAddress2.getHostName());//域名,或者自己电脑的名字

        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

1.4端口

端口表示正在计算机上运行的进程(程序);

  • 不同的进程有不同的端口号,用来区分软件
  • 被规定位一个16位的整数 0-65535
  • TCP,UDP :65536*2 (tcp:80,udp:80 是可以的),单个协议下,端口号不能冲突。
  • 端口分类
    • 公有端口 0~1023

    • 程序注册端口: 1024~49151 , 分配给用户或者程序

      • Tmacat:8080
      • MySQL : 3306
      • Oracle : 1521
    • 动态,私有端口:49152~65535

      netstat -ano   #查看所有的端口
      netstat -ano|findstr "63540"  #查看指定的端口
      tasklist|findstr "63540"  #查看指定进程
      #使用任务管理器查看PID
      

      image-20210714142030870

      端口号与IP地址的组合,得出一个网络套接字:Socket,所以说一些网络编程也被称为Socket编程

      InetSocketAddress

      package com.Java网络编程;
      
      
      import java.net.InetSocketAddress;
      
      public class Test_InetSocketAddress {
          public static void main(String[] args) {
              InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1",8080);
              InetSocketAddress socketAddress2 = new InetSocketAddress("localhost",8080);
              System.out.println(socketAddress);
              System.out.println(socketAddress2);
      
              System.out.println(socketAddress.getAddress());
              System.out.println(socketAddress.getHostName()); //地址
              System.out.println(socketAddress.getPort());    //端口
          }
      }
      
      

1.5 通信协议

协议:约定 ,就好比我们都说的普通话,大家才能听懂我讲的,但是我们还有自己的方言

网络通信协议:速率,传输码率,代码结构,传输控制。。。

问题:网路协议太复杂?

计算机网络通信涉及内容很多,比如指定源地址和目标地址,加密解密,压缩解压缩,差错控制,流量 控制,路由控制,如何实现如此复杂的网络协议呢?

通信协议分层的思想

在制定协议时,把复杂成份分解成一些简单的成份,再将他们复合起来。最常用的复合方式是层次方 式,即同层间可以通信,上一层调用下一层,而与再下一层不发生关系。各层互不影响,利于系统的开 发和扩展。

TCP/IP 协议簇 (实际上是一组协议)

  • 传输层协议中有两个非常重要的协议

    • 用户传输协议 TCP
    • 用户数据报协议 UDP
  • 出名的协议

    • TCP
    • IP:网络互联协议

image-20210714150404452

TCP UDP 对比

TCP:打电话

  • 连接,稳定

  • 三次握手 四次挥手

    最少需要三次,保证稳定连接!
    A:你瞅啥?
    B:瞅你咋地?
    A:干一场!
    
    
    A:我要走了!
    B:你真的要走了吗?
    B:你真的真的要走了吗?
    A:我真的要走了!
    
  • 客户端,服务端

  • 传输完成,释放连接,效率低

UPD:发短信

  • 不连接,不稳定
  • 客户端,服务端 :没有明确的界限
  • 不管有没有准备好,都可以发给你
  • DDOS:洪水攻击 (饱和攻击)

1.6 TCP

客户端

  1. 连接服务器 Socket(ip地址,端口)

  2. 发送消息 getOutputStream

    package java网络编程.lesson02;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    //客户端
    public class TcpClient_Demo01 {
        public static void main(String[] args) {
            
            try {
                //1.要知道服务器的地址,端口号
                InetAddress serverIP = InetAddress.getByName("localhost");
                int port=9999;
                //2.创建一个socket连接
                Socket socket = new Socket(serverIP,9999);//ip地址与端口号的组合--网络套接字
                //3.发送消息 IO流
                OutputStream os = socket.getOutputStream();
                os.write("你好啊哈哈哈哈哈".getBytes());
    
                //关闭流
                os.close();
                socket.close();
    
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    

服务器

  1. 建立服务器的端口 ServerSocket

  2. 等待用户的连接 accept

  3. 接受用户的消息 getInputStream

    package java网络编程.lesson02;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    //服务端
    public class TcpServer_Demo01 {
    
        public static void main(String[] args) {
            try {
                //1.我得有一个地址
                ServerSocket serverSocket = new ServerSocket(9999);
    
                //2.等待客户端连接过来
                Socket socket = serverSocket.accept();
                System.out.println("服务端启动");
    
                //3.读取客户端的消息
                InputStream is = socket.getInputStream();
    
                //管道流
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int len;
                while((len=is.read(buffer))!=-1){
                    baos.write(buffer,0,len);
                }
                System.out.println(baos.toString());
                //关闭流
                baos.close();
                is.close();
                socket.close();
                serverSocket.close();
    
                System.out.println("服务端关闭");
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

文件上传

服务器端

package java网络编程.lesson02;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer_Demo02 {
    public static void main(String[] args) {

        try {
            //1.创建服务
            ServerSocket serverSocket = new ServerSocket(9000);
            //2.监听客服端的连接
            Socket socket = serverSocket.accept(); //阻塞式监听,
            //3.获取输入流
            InputStream is = socket.getInputStream();

            //4.文件输出
            FileOutputStream fos = new FileOutputStream(new File("receive.png"));
            byte[] buffer = new byte[1024];
            int len;
            while((len=is.read(buffer))!=-1){
                fos.write(buffer,0,len);
            }

            //通知服务器我接受完毕了
            OutputStream os = socket.getOutputStream();
            os.write("我接收完毕了,你可以断开了".getBytes());//传输 byte[]


            //关闭资源
            fos.close();
            is.close();
            socket.close();
            serverSocket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端

package java网络编程.lesson02;import java.io.*;import java.net.InetAddress;import java.net.Socket;public class TcpClient_Demo02 {    public static void main(String[] args) {        //1.创建一个Socket连接        try {            Socket socket = new Socket(InetAddress.getByName("172.16.47.121"), 9000);            //2.创建一个输出流            OutputStream os = socket.getOutputStream();            //3.读取文件            FileInputStream fis = new FileInputStream("D:\\shixun\\tup.png");            //4.写出文件            byte[] buffer = new byte[1024];            int len;            while((len=fis.read(buffer))!=-1){                os.write(buffer,0,len);            }            //通知服务器,我已经传输完了            socket.shutdownOutput();            //确定服务器接受完毕,才能断开连接            InputStream inputStream = socket.getInputStream();            //传输 byte[] 数据,用ByteArray(接受字符串的管道流)            ByteArrayOutputStream baos = new ByteArrayOutputStream();            byte[] buffer2 = new byte[1024];            int len2;            while((len2=inputStream.read(buffer2))!=-1){                baos.write(buffer2,0,len2);            }            System.out.println(baos.toString());            //5.关闭资源            baos.close();            inputStream.close();            fis.close();            os.close();            socket.close();        } catch (IOException e) {            e.printStackTrace();        }    }}

1.7 UDP


发送短信:不用连接,需要知道对方的地址!

发送消息


package java网络编程.lesson03;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;//不需要连接服务器public class UDPClient_Demo01 {    public static void main(String[] args) throws Exception {        //1.建立一个Socket        DatagramSocket socket = new DatagramSocket();        //region 2.建一个包        String str ="你好啊,服务器!";        byte[] msg = str.getBytes();        //发送给谁        InetAddress localhost = InetAddress.getByName("localhost"); //ip地址        int port = 9090; //端口号        //建包         DatePacket(数据(转为字节),数据开始,数据结束,ip,端口)        DatagramPacket packet = new DatagramPacket(msg,0,msg.length,localhost,9090);        //endregion        //3.发送包        socket.send(packet);        //4.关闭流        socket.close();    }}

接受端

package java网络编程.lesson03;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;//随时等待客户端的连接 (收快递)public class UDPServer_Demo01 {    public static void main(String[] args) throws Exception {        //开放端口        DatagramSocket socket = new DatagramSocket(9090);        //接受数据包        byte[] buffer = new byte[1024];        DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);        socket.receive(packet); //阻塞接收        byte[] rmsg = packet.getData();     //传输的是 byte[]        String rmasege = new String(rmsg);        System.out.println(packet.getAddress().getHostAddress());        System.out.println(new String(packet.getData(),0,packet.getLength()));        System.out.println(rmasege);        //关闭连接        socket.close();    }}

循环发送

package java网络编程.chat;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetSocketAddress;import java.net.SocketException;public class UdpSender_Demo01 {    public static void main(String[] args) throws Exception {        DatagramSocket socket = new DatagramSocket(8888);        //准备数据 : 控制台读取 System.in        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));        while(true){            String data = reader.readLine();            byte[] datas = data.getBytes();            //数据包        DategramPacket(数据,起,始,具体地址)            DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));            socket.send(packet);            if(data.equals("bye"))                break;        }        socket.close();    }}

接收端

package java网络编程.chat;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;public class UdpReceive_Demo01 {    public static void main(String[] args) throws Exception {        DatagramSocket socket = new DatagramSocket(6666);//socket的port用来接受数据包        while(true){            //准备接收包 (创建一个包)            byte[] buffer = new byte[1024];            DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);            socket.receive(packet); //阻塞式接受包裹            //输出数据 + 断开连接 判断            byte[] data = packet.getData();            String receiveData = new String(data, 0, data.length);            System.out.println(receiveData);            if(receiveData.trim().equals("bye")){   //记得加trim 去除字符串首尾空格                System.out.println("退出了啊");                break;            }        }        socket.close();    }}

在线咨询

发送端

package java网络编程.chat;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetSocketAddress;import java.net.SocketException;public class TalkSend implements Runnable{    DatagramSocket socket;  //socket连接    BufferedReader reader;  // 缓冲输入数据    private  int fromPort;  //自己的端口 (没什么用)    private String toIP;    //对方 ip  (发送到服务器)    private int toPort;     //对方 端口    //初始化 赋值(所要发送到)端口+建立连接    public TalkSend(int fromPort, String toIP, int toPort) {        this.fromPort = fromPort;        this.toIP = toIP;        this.toPort = toPort;        try {            socket = new DatagramSocket(fromPort);   //***建立socket连接(本地端口)            reader = new BufferedReader(new InputStreamReader(System.in)); // 建立缓存,读取控制台输入        } catch (SocketException e) {            e.printStackTrace();        }    }    @Override    public void run() { //开启线程        //一直接收信息,直到收到结束指令        while(true){            try {                String data = reader.readLine();  //读取控制台接收到的数据                byte[] datas = data.getBytes();   //准备 打包发走                //数据包        DategramPacket(数据,起,始,具体地址-(ip,端口))                DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIP,this.toPort));                socket.send(packet); //***发送包                if(data.equals("bye"))                    break;            } catch (Exception e) {                e.printStackTrace();            }        }        socket.close(); //关闭接口    }}

接收端

package java网络编程.chat;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;public class TalkReceive implements Runnable{    DatagramSocket socket=null;    private int port;    private String masFrom;    //初始化 本地服务器端口+发送者+建立连接    public TalkReceive(int port,String masFrom) {        this.port = port;        this.masFrom = masFrom;        try {            socket = new DatagramSocket(port);  //建立端口,等待连接        } catch (SocketException e) {            e.printStackTrace();        }    }    @Override    public void run() {        while(true){            try {                //准备接收包 (创建一个包)                byte[] buffer = new byte[1024];                DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);                socket.receive(packet); //阻塞式接受包裹                //输出数据 + 断开连接 判断                byte[] data = packet.getData();                String receiveData = new String(data, 0, data.length);                System.out.println(this.masFrom+":"+receiveData);  //xx 对此端口说 :                if(receiveData.trim().equals("bye")){   //记得加trim 去除字符串首尾空格                    System.out.println("退出了啊");                    break;                }            } catch (IOException e) {                e.printStackTrace();            }        }        socket.close(); //关闭连接端口    }}

学生老师端

package java网络编程.chat;//学生端 发送+接收public class TalkStudent {    public static void main(String[] args) {        //开启两个线程        new Thread(new TalkSend(7777,"localhost",9999)).start();        new Thread(new TalkReceive(8888,"老师")).start();    }}//老师端class TalkTeacher{    public static void main(String[] args) {                   //发送线程   本地发送端口 , 发送到 ip , 发送到 端口        new Thread(new TalkSend(4444,"localhost",8888)).start();                    //接收线程     服务器的端口 ,接收xx的信息        new Thread(new TalkReceive(9999,"学生")).start();    }}

在线咨询:两个人都可以是发送方,也可以是接收方。 ( 多线程 )

1.8 URL

https://www.baidu.com/

统一资源定位符:定位资源的,定位互联网上的某一个资源

DNS 域名解析 www.baidu.com –> xxx.xxx.x.x (把域名变成IP)

协议: //ip地址: 端口/项目名/资源 

url由五部分组成,可少不能多

url类

  • URL (Uniform Resource Locator): 统一资源定位符,它表示 internet 上某一资源的地址。

  • URL可以用来标识一个资源,而且还指明了如何locate:定位这个资源.

  • 通过URL 我们可以访问Internet上的各种网络资源,比如最常见的 www,ftp站点。浏览器通过解析 给定的URL可以在网络上查找相应的文件或其他资源。

  • URL的基本结构由5部分组成:

    传输协议://主机名: 端口号/文件名 #片段名 ?参数列表
    

例:

package java网络编程.lesson04;import java.net.MalformedURLException;import java.net.URL;public class URL_Demo01 {    public static void main(String[] args) throws MalformedURLException {        URL url = new URL("http://localhost:8080/helloworld/index.html?username=kuangsen&passwordl=1234");        System.out.println(url.getProtocol());  //协议名        System.out.println(url.getHost());     //主机ip        System.out.println(url.getPort());     //端口        System.out.println(url.getPath());     //文件        System.out.println(url.getFile());     //文件全路径        System.out.println(url.getQuery());    //参数    }}

下载网站上的文件

package java网络编程.lesson04;import java.io.FileOutputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;public class URL_Demo爬虫 {    public static void main(String[] args) throws Exception {        //1.下载地址        String url1 ="https://m801.music.126.net/20210715170538/7b4956de493e1b5aada28f589badbc96/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/9660760478/7153/0dca/51c3/6eadd044096868fffb1a394b1a8f1e34.m4a";        URL url = new URL(url1);        //忽略证书信任        HttpsURLValidator.httpsRequestTrue(url1); //url为https请求地址        //2.连接到这个资源 HTTP   url.openConnection();        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();        //获得输入流        InputStream inputStream = urlConnection.getInputStream();//得到流        //写出文件        FileOutputStream fos = new FileOutputStream("ww.m4a");        byte[] buffer = new byte[1024];        int len;        while((len=inputStream.read(buffer))!=-1){            fos.write(buffer,0,len); //写出这个数据        }        fos.close();        inputStream.close();        urlConnection.disconnect(); //断开连接    }}

有网站证书信任问题,自己添加一个工具类 HttpsURLValidator

package java网络编程.lesson04;/**     忽略证书信任问题 *  一个信任 https证书的工具类, *  在urlConnection请求前 加入一条语句 : HttpsURLValidator.httpsRequestTrue(url); //url为https请求地址 * *///import lombok.extern.slf4j.Slf4j;import sun.net.www.protocol.https.HttpsURLConnectionImpl;import javax.net.ssl.HostnameVerifier;import javax.net.ssl.HttpsURLConnection;import javax.net.ssl.SSLSession;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLConnection;//@Slf4jpublic class HttpsURLValidator {    HostnameVerifier hv = new HostnameVerifier() {        public boolean verify(String urlHostName, SSLSession session) {            System.out.println("Warning: URL Host: " + urlHostName + " vs. "                    + session.getPeerHost());            return true;        }    };    /**     * https忽略SSL的方法     * @param url     */    public static void httpsRequestTrue(String url){//访问https地址直接调用这个方法        try {            //忽略https证书的再请求            HttpsURLValidator.trustAllHttpsCertificates();            HostnameVerifier hv = new HostnameVerifier() {                public boolean verify(String urlHostName, SSLSession session) {                    return true;                }            };            URL u = new URL(url);            HttpsURLConnection.setDefaultHostnameVerifier(hv);            URLConnection urlConnection = (HttpsURLConnectionImpl)u.openConnection();        }catch (Exception e){            e.printStackTrace();       //     log.error(e.getMessage());        }    }    protected final String retrieveResponseFromServer(final URL validationUrl,                                                      final String ticket) {        HttpURLConnection connection = null;        try {            connection = (HttpURLConnection) validationUrl.openConnection();            final BufferedReader in = new BufferedReader(new InputStreamReader(                    connection.getInputStream()));            String line;            final StringBuffer stringBuffer = new StringBuffer(255);            synchronized (stringBuffer) {                while ((line = in.readLine()) != null) {                    stringBuffer.append(line);                    stringBuffer.append("\n");                }                return stringBuffer.toString();            }        } catch (final IOException e) {        //    log.error(e.getMessage());            e.printStackTrace();            return null;        } catch (final Exception e1){         //   log.error(e1.getMessage());            e1.printStackTrace();            return null;        }finally {            if (connection != null) {                connection.disconnect();            }        }    }    protected static void trustAllHttpsCertificates() throws Exception {        javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];        javax.net.ssl.TrustManager tm = new miTM();        trustAllCerts[0] = tm;        javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext                .getInstance("SSL");        sc.init(null, trustAllCerts, null);        javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc                .getSocketFactory());    }    static class miTM implements javax.net.ssl.TrustManager,            javax.net.ssl.X509TrustManager {        public java.security.cert.X509Certificate[] getAcceptedIssuers() {            return null;        }        public boolean isServerTrusted(                java.security.cert.X509Certificate[] certs) {            return true;        }        public boolean isClientTrusted(                java.security.cert.X509Certificate[] certs) {            return true;        }        public void checkServerTrusted(                java.security.cert.X509Certificate[] certs, String authType)                throws java.security.cert.CertificateException {            return;        }        public void checkClientTrusted(                java.security.cert.X509Certificate[] certs, String authType)                throws java.security.cert.CertificateException {            return;        }    }}

附:忽略网站信任证书 工具类 HttpsURLValidator

package java网络编程.lesson04;/**     忽略证书信任问题 *  一个信任 https证书的工具类, *  在urlConnection请求前 加入一条语句 : HttpsURLValidator.httpsRequestTrue(url); //url为https请求地址 * *///import lombok.extern.slf4j.Slf4j;import sun.net.www.protocol.https.HttpsURLConnectionImpl;import javax.net.ssl.HostnameVerifier;import javax.net.ssl.HttpsURLConnection;import javax.net.ssl.SSLSession;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLConnection;//@Slf4jpublic class HttpsURLValidator {    HostnameVerifier hv = new HostnameVerifier() {        public boolean verify(String urlHostName, SSLSession session) {            System.out.println("Warning: URL Host: " + urlHostName + " vs. "                    + session.getPeerHost());            return true;        }    };    /**     * https忽略SSL的方法     * @param url     */    public static void httpsRequestTrue(String url){//访问https地址直接调用这个方法        try {            //忽略https证书的再请求            HttpsURLValidator.trustAllHttpsCertificates();            HostnameVerifier hv = new HostnameVerifier() {                public boolean verify(String urlHostName, SSLSession session) {                    return true;                }            };            URL u = new URL(url);            HttpsURLConnection.setDefaultHostnameVerifier(hv);            URLConnection urlConnection = (HttpsURLConnectionImpl)u.openConnection();        }catch (Exception e){            e.printStackTrace();       //     log.error(e.getMessage());        }    }    protected final String retrieveResponseFromServer(final URL validationUrl,                                                      final String ticket) {        HttpURLConnection connection = null;        try {            connection = (HttpURLConnection) validationUrl.openConnection();            final BufferedReader in = new BufferedReader(new InputStreamReader(                    connection.getInputStream()));            String line;            final StringBuffer stringBuffer = new StringBuffer(255);            synchronized (stringBuffer) {                while ((line = in.readLine()) != null) {                    stringBuffer.append(line);                    stringBuffer.append("\n");                }                return stringBuffer.toString();            }        } catch (final IOException e) {        //    log.error(e.getMessage());            e.printStackTrace();            return null;        } catch (final Exception e1){         //   log.error(e1.getMessage());            e1.printStackTrace();            return null;        }finally {            if (connection != null) {                connection.disconnect();            }        }    }    protected static void trustAllHttpsCertificates() throws Exception {        javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];        javax.net.ssl.TrustManager tm = new miTM();        trustAllCerts[0] = tm;        javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext                .getInstance("SSL");        sc.init(null, trustAllCerts, null);        javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc                .getSocketFactory());    }    static class miTM implements javax.net.ssl.TrustManager,            javax.net.ssl.X509TrustManager {        public java.security.cert.X509Certificate[] getAcceptedIssuers() {            return null;        }        public boolean isServerTrusted(                java.security.cert.X509Certificate[] certs) {            return true;        }        public boolean isClientTrusted(                java.security.cert.X509Certificate[] certs) {            return true;        }        public void checkServerTrusted(                java.security.cert.X509Certificate[] certs, String authType)                throws java.security.cert.CertificateException {            return;        }        public void checkClientTrusted(                java.security.cert.X509Certificate[] certs, String authType)                throws java.security.cert.CertificateException {            return;        }    }}

版权声明:本文为wwwwc原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wwwwc/p/15012681.html