当前位置: 首页 > news >正文

[Java]_[中级]_[使用okhttp3和HttpClient代理访问外部网络]

场景

  1. Javahttp库常用的有HttpClientOkhttp3, 如果公司有限制网络访问,需要代理才可以访问外网,那么如何使用代理Proxy
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version>
</dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.14.9</version>
</dependency>

说明

  1. 从性能方面来说,Okhttp3更出色一点。因为从我本机运行两个库的访问, Okhttp3会快一些。

  2. 从易用性来说,Ohttp3更好。OkHttpClient只需要在Builder里调用proxy(Proxy)传递一个Proxy对象之后即可。之后访问其他外网,就直接创建外网的Request即可,非常方便。 代理和非代理都用统一的方法。

    OkHttpClient.Builder builder = client.newBuilder();
    builder.proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(hostName, Integer.parseInt(hostPort))));...
    Response response = getClient().newCall(request).execute()
    
  3. HttpClient访问[1]则需要创建两个对象: 需要访问的主机HttpHost和URL里的请求路径和查询参数的HttpGet对象。 每次请求都需要传递这两个参数。而如果非代理的话,就需要调用另外的重载方法。

     HttpHost target = HttpHost.create(hostUrl);
    HttpGet request = new HttpGet("/user?name=xxx");
    //  HttpGet httpGet = new HttpGet(hostUrl); // 非代理...
    httpClient.execute(target, request) // 代理
    // httpClient.execute(httpGet); // 非代理
    
  4. 注意,出于创建Client比较废资源,okhttp3还是HttpClient官方都是推荐创建单例的OkHttpClientHttpClient对象来使用。对于CloseableHttpClient在使用完之后还需要调用close()关闭。OkHttpClient官方例子也没有调用销毁方法。

  5. 从源码设计上来说,Okhttp3在发送数据时,使用了自带的线程池,我们想用自己的线程池代替都不行。这个对某些线程数有严格限制的程序(Linux)非常不友好,甚至不能用,因为它的线程不受宿主程序控制。

    // 在类 RealConnectionPool里有这段代码
    static {executor = new ThreadPoolExecutor(0, 2147483647, 60L, TimeUnit.SECONDS, new SynchronousQueue(), Util.threadFactory("OkHttp ConnectionPool", true));
    }
    

例子

  1. 以下是使用okhttp3HttpClient的目前最佳做法.

OkHttpClientCaller


import Pair;
import StringUtils;
import HttpHelper;
import okhttp3.*;
import org.apache.log4j.Logger;import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.util.Map;public class OkHttpClientCaller {private static Logger logger = Logger.getLogger(OkHttpClientCaller.class);private static OkHttpClient client;public static void newClient(){OkHttpClient.Builder builder = new OkHttpClient().newBuilder();client = builder.cookieJar(new LocalCookieJar()).build();}public static void setProxy(String hostName,String hostPort){Proxy proxy = client.proxy();if(StringUtils.isEmpty(hostName,hostPort)){if(proxy != null) {client.newBuilder().proxy(null).cookieJar(new LocalCookieJar()).build();}}else{if(proxy == null){OkHttpClient.Builder builder = client.newBuilder();builder.proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(hostName, Integer.parseInt(hostPort))));client = builder.cookieJar(new LocalCookieJar()).build();}}}public static OkHttpClient getClient(){return client;}public static Pair<Boolean,String> doGet(Map<String,String> hostHeaders,String hostUrl){Request.Builder builder = new Request.Builder().url(hostUrl);HttpHelper.buildRequestHeader(builder,hostHeaders);Request request = builder.get().build();try (Response response = getClient().newCall(request).execute()) {return new Pair<>((response.code() == 200), response.body().string());} catch (Exception e) {logger.error(e.getMessage());}return new Pair<>(false,"");}/**** @param apiUrl* @param apiHeaders* @param contentType "application/x-www-form-urlencoded" "application/json"* @param content* @return*/public static Pair<Boolean,String> doPost(String apiUrl,Map<String,String> apiHeaders,String contentType,String content){// HeaderRequest.Builder builder = new Request.Builder().url(apiUrl);HttpHelper.buildRequestHeader(builder,apiHeaders);MediaType mediaType = MediaType.parse(contentType);RequestBody body = RequestBody.create(mediaType,content);// Posttry(Response response = getClient().newCall(builder.post(body).build()).execute()){return new Pair<>((response.code() == 200), response.body().string());} catch (IOException e) {logger.error(e.getMessage());}return new Pair<>(false,"");}public static Pair<Boolean,String> doPostFormData(String apiUrl,Map<String,String> apiHeaders,String content){return doPost(apiUrl,apiHeaders,"application/x-www-form-urlencoded",content);}public static Pair<Boolean,String> doPostJsonData(String apiUrl,Map<String,String> apiHeaders,String content){return doPost(apiUrl,apiHeaders,"application/json",content);}
}

HttpClientCaller


import Pair;
import StringUtils;
import RequestUtils;
import HttpHelper;
import org.apache.http.HttpHost;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.HttpContext;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Map;import static RequestUtils.getPathAndQueryParam;
import static RequestUtils.getPort;public class HttpClientCaller {private static Logger logger = Logger.getLogger(HttpClientCaller.class);private static CloseableHttpClient httpClient;private static RequestConfig requestConfig;//传输超时时间, 10秒private static int socketTimeout = 10000;//建立连接超时时间,默认10秒private static int connectTimeout = 5000;//获取连接超时时间,10秒private static int connectRequest = 5000;private static HttpHost proxy = null;private static HttpRequestRetryHandler myRetryHandler = new HttpRequestRetryHandler() {@Overridepublic boolean retryRequest(IOException exception,int executionCount, HttpContext context) {return false;}};public static CloseableHttpClient createClientAttr(HttpClientBuilder builder){return builder.setRetryHandler(myRetryHandler).setMaxConnPerRoute(2).setMaxConnTotal(2).build();}public static void newClient() {// setMaxConnTotal是连接池中可用的总最大连接数。setMaxConnPerRoute是限制到单个端口或url的连接总数。httpClient = createClientAttr(HttpClients.custom());//根据默认超时限制初始化requestConfigrequestConfig = getCommonRequestConfigBuilder().build();}public static RequestConfig.Builder getCommonRequestConfigBuilder(){RequestConfig.Builder builder = RequestConfig.custom().setConnectionRequestTimeout(connectRequest).setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout);return builder;}/*** 不行: https://blog.csdn.net/woshirongshaolin/article/details/126992654* @return*/public static SSLConnectionSocketFactory createSSLFactory(){//使用 loadTrustMaterial() 方法实现一个信任策略,信任所有证书try {SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {// 信任所有public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {return true;}}).build();//NoopHostnameVerifier类:  作为主机名验证工具,实质上关闭了主机名验证,它接受任何//有效的SSL会话并匹配到目标主机。HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);return sslsf;} catch (NoSuchAlgorithmException e) {logger.error(e.getMessage());} catch (KeyManagementException e) {logger.error(e.getMessage());} catch (KeyStoreException e) {logger.error(e.getMessage());}return null;}/**** @param hostName* @param port*/public static void setProxy(String hostName,String port){// 不支持// https://github.com/apache/httpcomponents-client/blob/4.5.x/httpclient/src/examples/org/apache/http/examples/client/ClientExecuteProxy.javaif(StringUtils.isEmpty(hostName,port)){if(proxy != null)requestConfig = getCommonRequestConfigBuilder().setProxy(null).build();}else{if(proxy == null){closeClient();SSLConnectionSocketFactory sslFactory = createSSLFactory();if(sslFactory != null)httpClient = createClientAttr(HttpClients.custom().setSSLSocketFactory(sslFactory));proxy = new HttpHost(hostName, Integer.parseInt(port));requestConfig = getCommonRequestConfigBuilder().setProxy(proxy).build();}}}public static void closeClient(){try {if(httpClient != null)httpClient.close();httpClient = null;} catch (Exception e) {e.printStackTrace();}}public static RequestConfig getRequestConfig(){return requestConfig;}public static CloseableHttpClient getClient(){return httpClient;}public static Pair<Boolean,String> doGet(Map<String,String> hostHeaders, String hostUrl){if(proxy != null){URL url = RequestUtils.getUrlOrNull(hostUrl);HttpHost target = new HttpHost(url.getHost(), getPort(url),url.getProtocol());HttpGet request = new HttpGet(getPathAndQueryParam(url));request.setConfig(requestConfig);HttpHelper.buildRequestHeader(request,hostHeaders);try(CloseableHttpResponse response = httpClient.execute(target, request);){return new Pair<>((response.getStatusLine().getStatusCode() == 200),EntityUtils.toString(response.getEntity(), "utf-8"));}catch ( IOException e){e.printStackTrace();}}else{HttpGet httpGet = new HttpGet(hostUrl);httpGet.setConfig(requestConfig);HttpHelper.buildRequestHeader(httpGet,hostHeaders);try(CloseableHttpResponse response = httpClient.execute(httpGet);){return new Pair<>((response.getStatusLine().getStatusCode() == 200),EntityUtils.toString(response.getEntity(), "utf-8"));}catch ( IOException e){e.printStackTrace();}}return new Pair<>(false,"");}public static Pair<Boolean,String> doPost(String apiUrl,Map<String,String> apiHeaders,String contentType,String content) {if(proxy != null){URL url = RequestUtils.getUrlOrNull(apiUrl);HttpHost target = new HttpHost(url.getHost(), getPort(url),url.getProtocol());HttpPost post = new HttpPost(getPathAndQueryParam(url));HttpHelper.buildRequestHeader(post,apiHeaders);if(post.getFirstHeader("Content-Type") == null)post.addHeader("Content-Type",contentType);StringEntity postEntity = new StringEntity(content, "UTF-8");post.setEntity(postEntity);post.setConfig(requestConfig);try(CloseableHttpResponse response = httpClient.execute(target,post)){return new Pair<>((response.getStatusLine().getStatusCode() == 200),EntityUtils.toString(response.getEntity(), "utf-8"));} catch (IOException e) {logger.warn(e.getMessage());}}else{HttpPost post = new HttpPost(apiUrl);HttpHelper.buildRequestHeader(post,apiHeaders);if(post.getFirstHeader("Content-Type") == null)post.addHeader("Content-Type",contentType);StringEntity postEntity = new StringEntity(content, "UTF-8");post.setEntity(postEntity);post.setConfig(requestConfig);try(CloseableHttpResponse response = httpClient.execute(post)){return new Pair<>((response.getStatusLine().getStatusCode() == 200),EntityUtils.toString(response.getEntity(), "utf-8"));} catch (IOException e) {logger.warn(e.getMessage());}}return  new Pair<>(false,"");}public static Pair<Boolean,String> doPostFormData(String apiUrl,Map<String,String> apiHeaders,String content){return doPost(apiUrl,apiHeaders,"application/x-www-form-urlencoded; charset=UTF-8",content);}public static Pair<Boolean,String> doPostJsonData(String apiUrl,Map<String,String> apiHeaders,String content){return doPost(apiUrl,apiHeaders,"application/json; charset=UTF-8",content);}
}

HttpHelper


import okhttp3.Request;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.message.AbstractHttpMessage;import java.util.Map;public class HttpHelper {public static void buildRequestHeader(AbstractHttpMessage builder, Map<String,String> values){for (Map.Entry<String,String> keyValue:values.entrySet()) {builder.addHeader(keyValue.getKey(),keyValue.getValue());}}public static void buildRequestHeader(Request.Builder builder,Map<String,String> values){for (Map.Entry<String,String> keyValue:values.entrySet()) {builder.addHeader(keyValue.getKey(),keyValue.getValue());}}public static String toFormData(Map<String,String> params){StringBuilder sb = new StringBuilder();for (Map.Entry<String,String> keyValue: params.entrySet())sb.append(keyValue.getKey()).append("=").append(keyValue.getValue()).append("&");if(sb.length() > 0)return sb.substring(0,sb.length()-1);return "";}
}

RequestUtils

import java.net.MalformedURLException;
import java.net.URL;public class RequestUtils {/**** @param url* @return URL or null*/public static URL getUrlOrNull(String url){try {return new URL(url);} catch (MalformedURLException e) {e.printStackTrace();}return null;}public static int getPort(URL url){int port = url.getPort();return (port == -1)?url.getDefaultPort():port;}public static String getPathAndQueryParam(URL url){String path = url.getPath();String query = url.getQuery();if(query == null)return path;return String.format("%s?%s",path,query);}
}

运行

OkHttpClientCaller.newClient();
OkHttpClientCaller.setProxy("127.0.0.1","1283");
Pair<Boolean, String> pp = OkHttpClientCaller.doGet(headers, "https://www.bing.com");
if(pp.k)logger.info(pp.v);OkHttpClientCaller.closeClient();

参考

  1. httpcomponents-client/httpclient/src/examples/org/apache/http/examples/client/ClientExecuteProxy.java

  2. Httpclient3.1指定tlsv1.2协议访问https

  3. java http请求设置代理 Proxy_java

  4. RestTemplate发起HTTPS请求Unsupported or unrecognized SSL message

  5. HttpClient访问不安全的https链接报错:SSLHandshakeException

  6. httpclient信任所有证书解决SSLException:Unrecognized SSL message

  7. Java URI getQuery()方法及示例

相关文章:

[Java]_[中级]_[使用okhttp3和HttpClient代理访问外部网络]

场景 Java的http库常用的有HttpClient和Okhttp3, 如果公司有限制网络访问&#xff0c;需要代理才可以访问外网&#xff0c;那么如何使用代理Proxy&#xff1f; <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient<…...

ubuntu 20.04 docker 安装 mysql

要在Ubuntu 20.04上安装Docker并运行MySQL容器&#xff0c;您可以按照以下步骤操作&#xff1a; 1.更新系统包列表&#xff1a; sudo apt update2.安装Docker&#xff1a; sudo apt install docker.io3.启动Docker服务并设置其开机自启动&#xff1a; sudo systemctl start…...

C++在C语言基础上的优化

目录 一、命名空间 1、命名空间的定义 2、命名空间的使用 二、输入&输出 三、缺省参数 1、缺省参数的概念 2、缺省参数的分类 四、函数重载 五、引用 1.引用的概念 2.引用的特性 3、引用和指针的区别 六、内联函数 七、基于范围的for循环 一、命名空间 命名空…...

分享一个python实验室设备预约管理系统 实验室设备维修系统源码 lw 调试

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…...

兵者多诡(HCTF2016)

环境:https://github.com/MartinxMax/CTFer_Zero_one 题目简介 解题过程 登录首页 提交png图片上传抓包&#xff0c;可以看到是向upload文件提交数据 在fp参数中尝试伪协议读取home.php文件 http://127.0.0.1:88/HCTF2016-LFI/home.php?fpphp://filter/readconvert.base64…...

【JAVA-Day04】Java关键字和示例:深入了解常用关键字的用法

Java关键字和示例&#xff1a;深入了解常用关键字的用法 摘要Java 关键字、标识符和命名规范一、Java 关键字常用关键字DEMO1. 示例代码使用 if 和 else 关键字&#xff1a;2. 示例代码使用 for 循环&#xff1a;3. 示例代码使用 switch 关键字&#xff1a;4. 示例代码使用 wh…...

Android请求网络报错:not permitted by network security policy

一、错误记录 https的接口请求正常的&#xff0c; 请求http的接口时报错&#xff1a;not permitted by network security policy 二、问题分析 原因&#xff1a; 由于 Android P(版本27以上) 限制了明文流量的网络请求&#xff0c;非加密的流量请求都会被系统禁止掉。如果当…...

python报错:ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1

python报错&#xff1a;ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1 问题分析 说明&#xff1a;requests包引入了urllib3&#xff0c;而新版本的urllib3 需要OpenSSL 1.1.1以上版本&#xff0c;否则报错&#xff1a; ImportError: urllib3 v2.0 only supports Ope…...

如何使用adb command来设置cpu频率和核数

透過ADB Shell設定CPU開核與freq的command與用法如下: # Disable PPM echo 0 > /proc/ppm/enabled # Enable PPM (Default) echo 1 > /proc/ppm/enabled echo 0 > /proc/ppm/enabled Fixed # Core for each cluster echo X Y > /proc/ppm/policy/ut_fix_core_num …...

236. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先 题目-中等难度示例1. dfs 题目-中等难度 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p…...

Git常见问题:git pull 和 git pull --rebase二者区别

git pull 和 git pull --rebase 都是从远程仓库获取最新的更改并将其合并到本地分支。但它们之间的区别在于合并方式。以下是它们之间的主要区别&#xff1a; git pull&#xff1a; 当你执行 git pull 时&#xff0c;Git 会执行以下两个操作&#xff1a; git fetch&#xff…...

关于HarmonyOS元服务的主题演讲与合作签约

一、感言 坚持中&#xff0c;总会有很多意想不到的收获。 前几次参与HDC时更多的是观众、开发者、专家的身份&#xff0c;以参观、学习、交流为主。 通过几年的努力&#xff0c;和HarmonyOS功能成长&#xff0c;在2023年的HDC大会中&#xff0c;有了我的演讲&#xff0c;并带领…...

cache 学习

好文章&#xff1a; Cache的基本原理 - 知乎...

SSM - Springboot - MyBatis-Plus 全栈体系(六)

第二章 SpringFramework 四、SpringIoC 实践和应用 3. 基于 注解 方式管理 Bean 3.1 实验一&#xff1a;Bean 注解标记和扫描 (IoC) 3.1.1 注解理解 和 XML 配置文件一样&#xff0c;注解本身并不能执行&#xff0c;注解本身仅仅只是做一个标记&#xff0c;具体的功能是框…...

【Flutter】引入网络图片时,提示:Failed host lookup: ‘[图片host]‘

在使用 NetworkImage 组件加载外部图片时&#xff0c;提示 Failed host lookup: [图片host] 错误。 排查方向 1、清理缓存 解决方案&#xff1a; 尝试flutter clean清空缓存后重新安装依赖flutter pub get重新构建项目flutter create . 走完上述三个步骤后&#xff0c;再次…...

Python基础教程:索引和切片

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 索引&#xff08;下标&#xff09; 索引又称下标&#xff0c;用来表示可迭代对象中的某个元素的位置。 用正整数表示的索引值&#xff0c;从左向右定位&#xff0c;从 0 开始计数&#xff0c;如 0&#xff0c;1&#…...

JVM基础面试题

JDK、JRE、JVM的关系 JVM Java虚拟机&#xff0c;它只识别.class类型文件&#xff0c;它能将class文件中的字节码指令进行识别并调用操作系统向上的API完成动作。 JRE Java运行时环境。它主要包含两部分&#xff1a;Jvm的标准实现和Java的一些基本类库。相对于JVM来说,JRE多出来…...

蓝桥杯官网填空题(平方末尾)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 能够表示为某个整数的平方的数字称为“平方数” 虽然无法立即说出某个数是平方数&#xff0c;但经常可以断定某个数不是平方数。 因为平方数的末位只可能是&#x…...

深入探究数据结构与算法:构建强大编程基础

文章目录 1. 为什么学习数据结构与算法&#xff1f;1.1 提高编程技能1.2 解决复杂问题1.3 面试准备1.4 提高代码效率 2. 学习资源2.1 经典教材2.2 在线学习平台2.3 学习编程社区 3. 数据结构与算法的实际应用3.1 排序算法3.2 图算法3.3 字符串匹配算法 4. 结论 &#x1f389;欢…...

Android 自定义View之圆形进度条

很多场景下都用到这种进度条&#xff0c;有的还带动画效果&#xff0c; 今天我也来写一个。 写之前先拆解下它的组成&#xff1a; 底层圆形上层弧形中间文字 那我们要做的就是&#xff1a; 绘制底层圆形&#xff1b;在同位置绘制上层弧形&#xff0c;但颜色不同&#xff…...

力扣(LeetCode)算法_C++——字母异位词分组

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“bat”],[“nat”,“tan”…...

【LeetCode-中等题】59. 螺旋矩阵 II

文章目录 题目方法一&#xff1a;二维数组缩圈填数字方法二&#xff1a; 题目 方法一&#xff1a;二维数组缩圈填数字 定义四个边界条件&#xff0c;每转一圈&#xff0c;把数值填进去&#xff0c;然后缩小一圈&#xff0c;直到不满足条件位置 结束循环条件可以是&#xff1a; …...

错误: 找不到或无法加载主类 Main

在用git回退到上个版本后发现&#xff0c;无法运行项目并提示 错误: 找不到或无法加载主类 Main 可以看到Main前面的图标也是号。 查了半天没有解决&#xff0c;问了个大佬&#xff0c;大佬一下就解决掉了&#xff0c;本文记录下解决过程。 错误原因是编辑器无法找到代码位置&…...

【云原生】Kubeadmin安装k8s集群

目录 前言&#xff1a; 一 环境部署 1.1 服务器部署功能 1.2 环境准备&#xff08;所有节点&#xff09; 二 安装docker&#xff08;所有节点&#xff09; 三 所有节点安装kubeadm&#xff0c;kubelet和kubectl 3.1 定义kubernetes源 3.2 开机自启kubelet 四 部署K8S集…...

Java:Springboot和React中枚举值(数据字典)的使用

目录 1、开发中的需求2、实现效果3、后端代码4、前端代码5、接口数据6、完整代码7、参考文章 1、开发中的需求 开发和使用过程中&#xff0c;通常会涉及四个角色&#xff1a;数据库管理员、后端开发人员、前端开发人员、浏览者 数据库使用int类型的数值进行存储&#xff08;e…...

git撤回 不小心 commit 进去的文件

我时候 我们可能讲一下不想提交的文件 不小心commit了进去 我们可以通过 git reset HEAD~来撤回刚才的添加记录...

qt之movetothread理解

基础概念 qt的下线程qthread&#xff0c;每个线程都有自己的事件循环exec。对象的线程上下文&#xff0c;每个对象都有自己的线程上下文&#xff0c;怎么理解呢&#xff0c;就是该对象在哪个线程创建&#xff0c;其线程上下文就是谁。每个qobject对象在创建时都有包含线程成员…...

深入剖析:垃圾回收你真的了解吗?

小熊学Java&#xff1a;https://www.javaxiaobear.cn/ 本文我们重点剖析 JVM 的垃圾回收机制。关于 JVM 垃圾回收机制面试中主要涉及这三个考题&#xff1a; JVM 中有哪些垃圾回收算法&#xff1f;它们各自有什么优劣&#xff1f; CMS 垃圾回收器是怎么工作的&#xff1f;有哪…...

ue5 物理场的应用

cable mat wpo particle 流体粒子 choas 破损 刚体 布料 cloud abp blueprint riggedbody 体积雾 毛发 全局的 局部的 非均匀的 连续变化的 也可以多个叠加 从全局 到 范围 除了vector还有scalar的值也就是0--1的黑白灰的值 但是最终输出的值的类型还是取决于这个 一…...

移动零00

题目链接 移动零 题目描述 注意点 将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序必须在不复制数组的情况下原地对数组进行操作 解答思路 采用双指针的思路&#xff0c;左指针指向已移动零的数组的尾部&#xff0c;右指针指向为移动零的数组的头部&…...

阿里云服务器上做淘宝客网站/关键词首页排名优化公司推荐

一、轴类零件是常见的零件之一。按轴类零件结构形式不同&#xff0c;一般可分为光轴、阶梯轴和异形轴三类&#xff1b;或分为实心轴、空心轴等。 二、台阶轴的加工工艺较为典型&#xff0c;反映了轴类零件加工的大部分内容与基本规律。 1、零件图样分析 传动轴 所示零件是减…...

手机网站app制作/天津百度推广电话号码

修复此问题 禁用内核调试&#xff0c;在 Visual Studio 中调试。- 或 -使用内核调试器而不是 Visual Studio 进行调试。- 或 -在内核调试器中禁用用户模式异常。在当前会话中禁用内核调试 在命令提示处&#xff0c;键入&#xff1a; 复制代码 Kdbgctrl.exe -d对所有会话禁用内核…...

现在做网站用的软件/关键词排名点击软件首页

博客地址&#xff1a;http://www.moonxy.com 一、前言 Elasticsearch 底层依赖于 Lucene 库&#xff0c;而 Lucene 库完全是 Java 编写的&#xff0c;前面的文章都是发送的 RESTful API 请求&#xff0c;其实这些请求最后还是通过 Java 执行的。RESTful API 能做的 Java API 都…...

机械厂做网站到底有没有效果/刷关键词排名seo

注意&#xff1a;当你发现你设置了所有改设置的后&#xff0c;下拉刷新还是不能使用的话就去找找你的代码是不是存在俩个下拉刷新的方法 json文件夹 {"enablePullDownRefresh": true,"backgroundTextStyle": "dark" }需要刷新的数据 /** 小程…...

石湾做网站公司/怎么注册自己的网站域名

一、监视内存计数器要监视内存不足的状况&#xff0c;请从以下的对象计数器开始&#xff1a;1.内存信息&#xff1a;Memory\ Available BytesMemory\ Pages/secMemory\ Available Bytes如果您怀疑有内存泄露&#xff0c;请监视 Memory\Available Bytes 和 Memory\ Committed By…...

58同城网络营销/长春做网络优化的公司

1、安装python库&#xff0c;用到读取csv的库pandas&#xff0c;获取IP经度和纬度的库pygeoippip install pandaspip install pygeoip2、下载GeoIP库3、读取ip&#xff0c;转化为point.js文件&#xff0c;源码如下&#xff1a;#!/usr/bin/pythonimport pandas as pdimport pyge…...