1. 首先要初始化ssl context

 SSLContext context = SSLContext.getDefault();
socket = (SSLSocket) context.getSocketFactory().createSocket();
socket.setHandshakeApplicationProtocolSelector((sslSocket, strings) -> "TLSv1.1");

2. 我们要做一个简单的get请求,所以要了解下http协议

比如我们要获取 https://www.cnblogs.com/tomj2ee/p/16153238.html 的内容

那么http格式就是如下格式

GET /tomj2ee/p/16153238.html HTTP/1.0
HOST:www.cnblogs.com

包装http请求


private String createRequestHeader(URL url) throws MalformedURLException {
StringBuilder sb = new StringBuilder();
String path = "/";
if (url.getPath() != null && url.getPath().length() > 0) {
path = url.getPath();
}
sb.append("GET " + path + " HTTP/1.0" + BR);
sb.append("HOST: " + url.getHost() + BR);
sb.append("User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + BR);
sb.append(BR); return sb.toString();
}

3. socket 写入http 请求数据

 //连接到http请求服务器
socket.connect(new InetSocketAddress(address, port), 10 * 1000);
//写入http请求头部
out = socket.getOutputStream();
String req = createRequestHeader(url);
out.write(req.getBytes());
out.flush();

4. socket 读取网页返回内容

 in = socket.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
StringBuilder ret = new StringBuilder();
while ((len = in.read(buf)) >= 0) {
ret.append(new String(buf, 0, len));
}
return ret.toString();

5.完整源码



package myhttp;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManager;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.SecureRandom; public class MyHttpClient { private static String BR = "\r\n"; /**
* 通过 socket 获取 http get请求
*
* @param host
* @return
* @throws IOException
*/
public String getUrl(String host) {
InputStream in = null;
OutputStream out = null;
SSLSocket socket=null;
try {
SSLContext context = SSLContext.getDefault();
socket = (SSLSocket) context.getSocketFactory().createSocket();
socket.setHandshakeApplicationProtocolSelector((sslSocket, strings) -> "TLSv1.1");
URL url = new URL(host);
InetAddress address = InetAddress.getByName(url.getHost());
int port = 443;
if (url.getPort() > 0) {
port = url.getPort();
}
//连接到http请求服务器
socket.connect(new InetSocketAddress(address, port), 10 * 1000);
//写入http请求头部
out = socket.getOutputStream();
String req = createRequestHeader(url);
out.write(req.getBytes());
out.flush();
in = socket.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
StringBuilder ret = new StringBuilder();
while ((len = in.read(buf)) >= 0) {
ret.append(new String(buf, 0, len));
}
return ret.toString();
} catch (Exception ex) {
ex.printStackTrace();
return "";
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
//do nothing
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
//do nothing
}
}
if(socket!=null){
try{
socket.close();
}catch (IOException ex){
//do nothing
}
}
}
} /**
* 创建http的请求头
* @param url
* @return
* @throws MalformedURLException
*/
private String createRequestHeader(URL url) throws MalformedURLException {
StringBuilder sb = new StringBuilder();
String path = "/";
if (url.getPath() != null && url.getPath().length() > 0) {
path = url.getPath();
}
sb.append("GET " + path + " HTTP/1.0" + BR);
sb.append("HOST: " + url.getHost() + BR);
sb.append("User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + BR);
sb.append(BR); return sb.toString();
} public static void main(String[] args) {
String ret = new MyHttpClient().getUrl("https://www.runoob.com/java/java-networking.html");
System.out.println(ret);
} }

总结

平时我们习惯了使用httpclient库来获取http get,post请求,这个决定自己实现一个简单的功能,对socket使用和http协议的了解,比较有帮助。

java通过socket实现https get 请求网页的更多相关文章

  1. Java的post(HTTPS)请求-----接口测试

    package com.ju.util; import java.io.BufferedReader; import java.io.IOException; import java.io.Input ...

  2. Java发送socket请求的工具

    package com.tech.jin.util; import java.io.ByteArrayOutputStream; import java.io.IOException; import ...

  3. java https post请求并忽略证书,参数放在body中

    1 新建java类,作用是绕过证书用 package cn.smartercampus.core.util; import java.security.cert.CertificateExceptio ...

  4. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  5. Java利用httpasyncclient进行异步HTTP请求

    Java利用httpasyncclient进行异步HTTP请求 前段时间有个需求在springmvc mapping的url跳转前完成一个统计的业务.显然需要进行异步的处理,不然出错或者异常会影响到后 ...

  6. Java实现——Socket网络通信的机制以及实现举例

    1. 网络间的进程通信与Socket TCP/IP协议族中网络层的IP地址可以唯一标识网络中的主机,而传输层的协议+端口可以唯一标识主机中的应用程序(进程).这样利用这三元组就可以标识网络的进程了,网 ...

  7. java基于socket的网络通信,实现一个服务端多个客户端的群聊,传输文件功能,界面使用Swing

    最近在复习java的io流及网络编程.但复习写那些样板程序总是乏味的.便准备写个项目来巩固.想来想去还是聊天项目比较好玩.如果日后完成的比较好自己也可以用(哈哈哈).并且自己后面也要继续巩固java多 ...

  8. Java基础教程——模拟浏览器发送请求

    JAVA访问网页 分别测试使用get和post方法访问网页,可以收到服务器的请求,并写入到html文件中. import java.io.*; import java.net.*; import ja ...

  9. JAVA之Socket编程

    网上对Socket的诠释很多,也很全,在这里我就不多说了,总之,现在的网络处处都在使用Socket.本帖是一个Socket的例子,用来模拟一个简单的登录系统,只有核心代码,访问数据库.输入神马的统统没 ...

随机推荐

  1. Java安全之Commons Collections6分析

    Java安全之Commons Collections6分析 0x00 前言 其实在分析的几条链中都大致相同,都是基于前面一些链的变形,在本文的CC6链中,就和前面的有点小小的区别.在CC6链中也和CC ...

  2. Wireshark-过滤器-数据包解析

    目录 过滤器 数据包解析 参考 推荐阅读: https://www.cnblogs.com/zwtblog/tag/计算机网络/ 过滤器 显示过滤器 和 捕获过滤器,俩者使用非常类似. 在Wiresh ...

  3. Windows中Nginx配置nginx.conf不生效解决方法

    转:https://lucifer.blog.csdn.net/article/details/83860644?utm_medium=distribute.pc_relevant.none-task ...

  4. 编译python(cpython)的源码及其用途

    获取python的源码 3.x及最新版本的源码:https://github.com/python/cpython python2.7分支的源码:https://github.com/python/c ...

  5. PyQt5 基本语法(五)

    目录 2. 输入控件(二) 2.2 步长调节 2.2.1 QAbstractSpinBox 2.2.1.1 描述 2.2.1.2 功能作用 2.2.1.2.1 使用 2.2.1.2.2 主要功能 2. ...

  6. python---复杂度、斐波那切数列、汉诺塔

    时间复杂度 ​ 用来估计算法运行时间的一个式子. ​ 一般来说, 时间复杂度高的算法比复杂度低的算法慢. 常见的时间复杂度: ​ O(1) < O(logn) < O(n) < O( ...

  7. 解决帝国CMS搜索页面模板不支持灵动标签和万能标签的方法

    1,打开 /e/search/result/index.php 文件 查找 require("../../class/connect.php"); require(".. ...

  8. 【课程汇总】OpenHarmony全场景Demo数字管家系列课(附链接)

    小孩放学了,做作业的时间到,窗帘.护眼灯自动打开,关掉电视和扫地机,给小孩一个安静舒适的学习环境:碰到学习难题,可以随时请求你的远程指导:晚上回家休息了,选择舒适的氛围灯,伴随着睡眠音乐进入梦乡:出门 ...

  9. oracle split 以及 简单json解析存储过程

    BEGIN; 由于之前工作上需要在oracle中做split功能以及json格分解.然后经过一番google和优化整合,最后整理到一个存储过程包中,易于管理,代码如下: 1.包定义: CREATE O ...

  10. k8s入门之Service(六)

    将一组pod公开为网络服务,通过service代理,可以实现负载均衡 一.ClusterIP 此方式只能在集群内访问 1.使用命令暴露已存在的pod (1)继续使用前面章节的案例,查看名称为nginx ...