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. hibernate 联合主键 composite-id

    如果表使用联合主键(一个表有两个以上的主键),你可以映射类的多个属性为标识符属性.如:<composite-id>元素接受<key-property> 属性映射(单表映射)和& ...

  2. Math类、Random类、System类、BigInteger类、BigDecimal类、Date类、SimpleDateFormat、Calendar类

    Math类* A:Math类概述 * Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函数. * B:成员方法 * public static int abs(int a)  ...

  3. vue后台管理系统组件弹窗

    //addFormVisibleIcon可在data中设置true与falsehttps://element.eleme.io/#/zh-CN/component/installation <e ...

  4. Docker入门(windows版),利用Docker创建一个Hello World的web项目

    Docker 当大家点开这篇博客的时候,相信大家对docker多多少少也有些认识了,最近学习docker这门技术,略微有些心得,写篇文章记录一下学习过程并帮大家跳过一些坑. docker的核心有两个, ...

  5. Python-术语对照表

    >>> 交互式终端中默认的 Python 提示符.往往会显示于能以交互方式在解释器里执行的样例代码之前. ... 具有以下含义: 交互式终端中输入特殊代码行时默认的 Python 提 ...

  6. /application/zabbix/sbin/zabbix_server: error while loading shared libraries: libmysqlclient.so.20: cannot open shared object file: No such file or directory

    在启动/usr/local/zabbix/sbin/zabbix_server 时报错如下 此时需要配置一个软连接指向该位置. ln -s /usr/local/mysql/lib/libmysqlc ...

  7. C/C++指针、函数、结构体、共用体

    指针 变量与地址 变量给谁用的? 变量是对某一块空间的抽象命名. 变量名就是你抽象出来的某块空间的别名. 指针就是地址.指向某个地址. 指针与指针变量 指针是指向某块地址.指针(地址)是常量. 指针变 ...

  8. Unity实现A*寻路算法学习1.0

    一.A*寻路算法的原理 如果现在地图上存在两点A.B,这里设A为起点,B为目标点(终点) 这里为每一个地图节点定义了三个值 gCost:距离起点的Cost(距离) hCost:距离目标点的Cost(距 ...

  9. Java 18为什么要指定UTF-8为默认字符集

    在Java 18中,将UTF-8指定为标准Java API的默认字符集.有了这一更改,依赖于默认字符集的API将在所有实现.操作系统.区域设置和配置中保持一致. 做这一更改的主要目标: 当Java程序 ...

  10. Git在项目中使用技巧

    1.常用的命令 mkdir 文件夹名 创建文件夹 clear 清楚屏幕 ls或者ll 将当前目录下的子文件和子目录平铺在控制台 find 目录名 将对应目录下的子孙文件或子孙目录平铺在控制台 rm 文 ...