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. Python Turtle库绘制表盘时钟

    运行效果: 源代码: 1 # coding=utf-8 2 3 import turtle 4 from datetime import * 5 6 # 抬起画笔,向前运动一段距离放下 7 def S ...

  2. 没有高度的div中的子元素高度自动撑开

     直接上代码: 很多时候 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  3. 常见的JVM 面试题

    1.讲一讲JVM的跨平台与跨语言 跨平台 我们写的一个类,在不同的操作系统上(Linux.windows.Mac OS)执行,效果是一样的.这就是JVM的跨平台性. 跨语言 JVM只识别字节码,JVM ...

  4. python常见内置函数

    一. map( ) 映射 l = [1,2,3,4] print(list(map(lambda x:x+1,l))) # 获取列表中每个元素并传递给匿名函数运算保存返回值 二. zip( ) 拉链 ...

  5. jsp中c:forEach使用

    首先需要在jsp中引入<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> ...

  6. gin框架使用【4.请求参数】

    GET url: http://127.0.0.1:8080/users?id=1&name=卷毛狒狒 package mainimport ( "github.com/gin-go ...

  7. IDEA小技巧:Markdown里的命令行可以直接运行了

    作为一名开发者,相信大部分人都喜欢用Markdown来写文章和写文档. 如果你经常用开源项目或者自己维护开源项目,肯定对于项目下的README文件也相当熟悉了吧,通常我们会在这里介绍项目的功能.如何使 ...

  8. [.NET Core]ASP.NET Core中如何解决接收表单时的不支持的媒体类型(HTTP 415 Unsupported Media Type)错误呢?

    [.NET Core]ASP.NET Core中如何解决接收表单时的不支持的媒体类型(HTTP 415 Unsupported Media Type)错误呢? 在ASP.NET Core应用程序中,接 ...

  9. python代码统计核酸检测结果截图

    #QQ:502440275@qq.com#本截图适合安康码截图,如需其他地区截图统计,可与我QQ或QQ邮箱联系#1.在当前文件夹下创建imgs文件夹用于存放图片,图片格式.jpg#2.在当前文件夹下创 ...

  10. JVM组成、GC回收机制、算法、JVM常见启动参数、JAVA出现OOM,如何解决、tomcat优化方法

    JVM组成.GC回收机制.算法.JVM常见启动参数.JAVA出现OOM,如何解决.tomcat优化方法