Java:HttpClient篇,HttpClient4.2在Java中的几则应用:Get、Post参数、Session(会话)保持、Proxy(代理服务器)设置,多线程设置......
原文:http://www.cnblogs.com/nayitian/p/3282029.html
新版HttpClient4.2与之前的3.x版本有了很大变化,建议从http://hc.apache.org/处以得到最新的信息。
- 关于HttpCore与HttpClient:HttpCore是位于HTTP传输组件的底层包,可以用来简化HTTP客户端与服务器端的开发。HttpClient是一个符合HTTP1.1版本,基于HttpCore类包的一个实现。它同时为客户端认证、HTTP状态管理、HTTP连接管理提供了可重用的客户端组件。HttpCore类包目前最新发布版本是httpcore-4.2.4;HttpClient类包的版本是httpclient-4.2.5。
了解到HttpCore包与HttpClient包的差别,在程序中就应该大致知道一些包它们存在于哪个类库中。比如:org.apache.http包属于HttpCore,而org.apache.http.client包属于HttpClient。 - HttpClient的API文档在下载的zip中已经包括;
HttpCore的API文档可以参考:http://hc.apache.org/httpcomponents-core-4.2.x/httpcore/apidocs/index.html - HttpClient4.2需要Java 5.0及以上版本;需要支持包有(下载zip包中已经包括):
* Apache HttpComponents HttpCore
* Apache Commons Logging
* Apache Commons Codec
1. 获取一个HTML页面的内容,一个简单的get应用
// 获取一个HTML页面的内容,一个简单的get应用public void grabPageHTML() throws Exception {HttpClient httpclient = new DefaultHttpClient();HttpGet httpget = new HttpGet("http://www.baidu.com/");HttpResponse response = httpclient.execute(httpget);HttpEntity entity = response.getEntity();String html = EntityUtils.toString(entity, "GBK");// releaseConnection等同于reset,作用是重置request状态位,为下次使用做好准备。// 其实就是用一个HttpGet获取多个页面的情况下有效果;否则可以忽略此方法。httpget.releaseConnection();System.out.println(html);}
2. 下载一个文件到本地(本示范中为一个验证码图片)
// 下载一个文件到本地(本示范中为一个验证码图片)public void downloadFile() throws Exception {String url = "http://www.lashou.com/account/captcha";String destfilename = "D:\\TDDOWNLOAD\\yz.png";HttpClient httpclient = new DefaultHttpClient();HttpGet httpget = new HttpGet(url);File file = new File(destfilename);if (file.exists()) {file.delete();}HttpResponse response = httpclient.execute(httpget);HttpEntity entity = response.getEntity();InputStream in = entity.getContent();try {FileOutputStream fout = new FileOutputStream(file);int l = -1;byte[] tmp = new byte[2048]; while ((l = in.read(tmp)) != -1) {fout.write(tmp);} fout.close();} finally {// 在用InputStream处理HttpEntity时,切记要关闭低层流。in.close();}httpget.releaseConnection();}
3. Post方法,模拟表单提交参数登录到网站并打开会员页面获取内容(会话保持)
// Post方法,模拟表单提交参数登录到网站。// 结合了上面两个方法:grabPageHTML/downloadFile,同时增加了Post的代码。public void login2Lashou() throws Exception {// 第一步:先下载验证码到本地String url = "http://www.lashou.com/account/captcha";String destfilename = "D:\\TDDOWNLOAD\\yz.png";HttpClient httpclient = new DefaultHttpClient();HttpGet httpget = new HttpGet(url);File file = new File(destfilename);if (file.exists()) {file.delete();}HttpResponse response = httpclient.execute(httpget);HttpEntity entity = response.getEntity();InputStream in = entity.getContent();try {FileOutputStream fout = new FileOutputStream(file);int l = -1;byte[] tmp = new byte[2048]; while ((l = in.read(tmp)) != -1) {fout.write(tmp);} fout.close();} finally {in.close();}httpget.releaseConnection(); // 第二步:用Post方法带若干参数尝试登录,需要手工输入下载验证码中显示的字母、数字BufferedReader br = new BufferedReader(new InputStreamReader(System.in));System.out.println("请输入下载下来的验证码中显示的数字...");String yan = br.readLine();HttpPost httppost = new HttpPost("http://www.lashou.com/account/login/");List<NameValuePair> params = new ArrayList<NameValuePair>();params.add(new BasicNameValuePair("user_id", "testuser007"));params.add(new BasicNameValuePair("pwd", "asdfg123"));params.add(new BasicNameValuePair("yan", yan));params.add(new BasicNameValuePair("save_user", "on"));params.add(new BasicNameValuePair("save_pwd", "on"));params.add(new BasicNameValuePair("sub", "登录"));httppost.setEntity(new UrlEncodedFormEntity(params));response = httpclient.execute(httppost);entity = response.getEntity();// 在这里可以用Jsoup之类的工具对返回结果进行分析,以判断登录是否成功String postResult = EntityUtils.toString(entity, "GBK"); // 我们这里只是简单的打印出当前Cookie值以判断登录是否成功。List<Cookie> cookies = ((AbstractHttpClient)httpclient).getCookieStore().getCookies();for(Cookie cookie: cookies)System.out.println(cookie);httppost.releaseConnection(); // 第三步:打开会员页面以判断登录成功(未登录用户是打不开会员页面的)String memberpage = "http://www.lashou.com/account/orders/";httpget = new HttpGet(memberpage);response = httpclient.execute(httpget); // 必须是同一个HttpClient!entity = response.getEntity();String html = EntityUtils.toString(entity, "GBK");httpget.releaseConnection();System.out.println(html);}
输出:
请输入下载下来的验证码中显示的数字...
sbzq
...
[version: 0][name: login_name2][value: testuser007][domain: www.lashou.com][path: /][expiry: Mon Sep 09 10:21:19 CST 2013]
[version: 0][name: pwd2][value: 4c88a4062736c26572d3ec382868fa2b][domain: lashou.com][path: /][expiry: Mon Sep 09 10:21:19 CST 2013]
?<!doctype html>
...
4. 设置代理服务器
// 设置代理服务器public void testProxy() throws Exception {HttpHost proxy = new HttpHost("127.0.0.1", 8888);// 方式一HttpClient httpclient = new DefaultHttpClient();httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);// 方式二HttpParams params = new BasicHttpParams(); params.setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);HttpClient httpclient1 = new DefaultHttpClient(params);}
5. 几种常用HTTP头的设置
// 几种常用HTTP头的设置public void testBasicHeader() throws Exception {HttpParams params = new BasicHttpParams(); Collection<BasicHeader> collection = new ArrayList<BasicHeader>();collection.add(new BasicHeader("Accept", "text/html, application/xhtml+xml, */*"));collection.add(new BasicHeader("Referer", "http://www.sina.com/"));collection.add(new BasicHeader("Accept-Language", "zh-CN"));collection.add(new BasicHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"));collection.add(new BasicHeader("Accept-Encoding", "gzip, deflate"));params.setParameter(ClientPNames.DEFAULT_HEADERS, collection);HttpClient httpclient = new DefaultHttpClient(params);// 下面内容略}
6. 多线程编程下的线程池设置
// 多线程编程下的线程池设置(这点在需要登录且用一个HttpClient对象抓取多个页面的情况下特别有用)public void testConnectionManager() throws Exception {// 连接池设置SchemeRegistry schemeRegistry = new SchemeRegistry();schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));schemeRegistry.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory()));PoolingClientConnectionManager cm = new PoolingClientConnectionManager(schemeRegistry);cm.setMaxTotal(200); // 连接池里的最大连接数cm.setDefaultMaxPerRoute(20); // 每个路由的默认最大连接数HttpHost localhost = new HttpHost("locahost", 80); // 可以针对某特定网站指定最大连接数cm.setMaxPerRoute(new HttpRoute(localhost), 30);// 其它设置HttpParams params = new BasicHttpParams(); params.setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY);HttpClient httpclient = new DefaultHttpClient(cm, params);// 下面内容略}
7. 测试HTTP上下文对象(HttpContext)
// 测试HTTP上下文对象(HttpContext)public void testContext() throws Exception {// 请求一个页面,然后解析各上下文对象DefaultHttpClient httpclient = new DefaultHttpClient();HttpContext localContext = new BasicHttpContext();HttpGet httpget = new HttpGet("http://www.baidu.com/");HttpResponse response = httpclient.execute(httpget, localContext);// the actual connection to the target server.HttpConnection conn = (HttpConnection) localContext.getAttribute(ExecutionContext.HTTP_CONNECTION); System.out.println("Socket timeout: " + conn.getSocketTimeout()); // the connection targetHttpHost target = (HttpHost) localContext.getAttribute(ExecutionContext.HTTP_TARGET_HOST);System.out.println("Final target: " + target);// the connection proxy, if used HttpHost proxy = (HttpHost) localContext.getAttribute(ExecutionContext.HTTP_PROXY_HOST);if (proxy != null)System.out.println("Proxy host/port: " + proxy.getHostName() + "/"+ proxy.getPort());// the actual HTTP requestHttpRequest request = (HttpRequest) localContext.getAttribute(ExecutionContext.HTTP_REQUEST);System.out.println("HTTP version: " + request.getProtocolVersion());Header[] headers = request.getAllHeaders();System.out.println("HTTP Headers: ");for (Header header : headers) {System.out.println("\t" + header.getName() + ": " + header.getValue());}System.out.println("HTTP URI: " + request.getRequestLine().getUri());// the actual HTTP responseresponse = (HttpResponse) localContext.getAttribute(ExecutionContext.HTTP_RESPONSE);HttpEntity entity = response.getEntity();if (entity != null) {System.out.println("Content Encoding:" + entity.getContentEncoding());System.out.println("Content Type:" + entity.getContentType());}// the flag indicating whether the actual request has been fully transmitted to the connection target. System.out.println("Sent flag: " + localContext.getAttribute(ExecutionContext.HTTP_REQ_SENT)); // 如果没有用到返回entity中的内容,那么要把它消费掉,以保证底层的资源得以释放。entity = response.getEntity();EntityUtils.consume(entity);}
输出:
Socket timeout: 0
Final target: http://www.baidu.com
HTTP version: HTTP/1.1
HTTP Headers:
Host: www.baidu.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.2.5 (java 1.5)
HTTP URI: /
Content Encoding:null
Content Type:Content-Type: text/html;charset=utf-8
Sent flag: true
8. 完整的代码
package com.clzhang.sample.net;import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collection; import java.util.List;import org.apache.http.Header; import org.apache.http.HttpConnection; import org.apache.http.HttpEntity; import org.apache.http.HttpHost; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.params.ClientPNames; import org.apache.http.client.params.CookiePolicy; import org.apache.http.conn.params.ConnRoutePNames; import org.apache.http.conn.routing.HttpRoute; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.cookie.Cookie; import org.apache.http.impl.client.AbstractHttpClient; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.PoolingClientConnectionManager; import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpParams; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.protocol.ExecutionContext; import org.apache.http.protocol.HttpContext; import org.apache.http.util.EntityUtils;public class HttpClientSample1 {// 获取一个HTML页面的内容,一个简单的get应用public void grabPageHTML() throws Exception {HttpClient httpclient = new DefaultHttpClient();HttpGet httpget = new HttpGet("http://www.baidu.com/");HttpResponse response = httpclient.execute(httpget);HttpEntity entity = response.getEntity();String html = EntityUtils.toString(entity, "GBK");// releaseConnection等同于reset,作用是重置request状态位,为下次使用做好准备。// 其实就是用一个HttpGet获取多个页面的情况下有效果;否则可以忽略此方法。httpget.releaseConnection();System.out.println(html);}// 下载一个文件到本地(本示范中为一个验证码图片)public void downloadFile() throws Exception {String url = "http://www.lashou.com/account/captcha";String destfilename = "D:\\TDDOWNLOAD\\yz.png";HttpClient httpclient = new DefaultHttpClient();HttpGet httpget = new HttpGet(url);File file = new File(destfilename);if (file.exists()) {file.delete();}HttpResponse response = httpclient.execute(httpget);HttpEntity entity = response.getEntity();InputStream in = entity.getContent();try {FileOutputStream fout = new FileOutputStream(file);int l = -1;byte[] tmp = new byte[2048]; while ((l = in.read(tmp)) != -1) {fout.write(tmp);} fout.close();} finally {// 在用InputStream处理HttpEntity时,切记要关闭低层流。in.close();}httpget.releaseConnection();}// Post方法,模拟表单提交参数登录到网站。// 结合了上面两个方法:grabPageHTML/downloadFile,同时增加了Post的代码。public void login2Lashou() throws Exception {// 第一步:先下载验证码到本地String url = "http://www.lashou.com/account/captcha";String destfilename = "D:\\TDDOWNLOAD\\yz.png";HttpClient httpclient = new DefaultHttpClient();HttpGet httpget = new HttpGet(url);File file = new File(destfilename);if (file.exists()) {file.delete();}HttpResponse response = httpclient.execute(httpget);HttpEntity entity = response.getEntity();InputStream in = entity.getContent();try {FileOutputStream fout = new FileOutputStream(file);int l = -1;byte[] tmp = new byte[2048]; while ((l = in.read(tmp)) != -1) {fout.write(tmp);} fout.close();} finally {in.close();}httpget.releaseConnection();// 第二步:用Post方法带若干参数尝试登录,需要手工输入下载验证码中显示的字母、数字BufferedReader br = new BufferedReader(new InputStreamReader(System.in));System.out.println("请输入下载下来的验证码中显示的数字...");String yan = br.readLine();HttpPost httppost = new HttpPost("http://www.lashou.com/account/login/");List<NameValuePair> params = new ArrayList<NameValuePair>();params.add(new BasicNameValuePair("user_id", "testuser007"));params.add(new BasicNameValuePair("pwd", "asdfg123"));params.add(new BasicNameValuePair("yan", yan));params.add(new BasicNameValuePair("save_user", "on"));params.add(new BasicNameValuePair("save_pwd", "on"));params.add(new BasicNameValuePair("sub", "登录"));httppost.setEntity(new UrlEncodedFormEntity(params));response = httpclient.execute(httppost);entity = response.getEntity();// 在这里可以用Jsoup之类的工具对返回结果进行分析,以判断登录是否成功String postResult = EntityUtils.toString(entity, "GBK"); // 我们这里只是简单的打印出当前Cookie值以判断登录是否成功。List<Cookie> cookies = ((AbstractHttpClient)httpclient).getCookieStore().getCookies();for(Cookie cookie: cookies)System.out.println(cookie);httppost.releaseConnection();// 第三步:打开会员页面以判断登录成功(未登录用户是打不开会员页面的)String memberpage = "http://www.lashou.com/account/orders/";httpget = new HttpGet(memberpage);response = httpclient.execute(httpget); // 必须是同一个HttpClient!entity = response.getEntity();String html = EntityUtils.toString(entity, "GBK");httpget.releaseConnection();System.out.println(html);}// 设置代理服务器public void testProxy() throws Exception {HttpHost proxy = new HttpHost("127.0.0.1", 8888);// 方式一HttpClient httpclient = new DefaultHttpClient();httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);// 方式二HttpParams params = new BasicHttpParams(); params.setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);HttpClient httpclient1 = new DefaultHttpClient(params);}// 几种常用HTTP头的设置public void testBasicHeader() throws Exception {HttpParams params = new BasicHttpParams(); Collection<BasicHeader> collection = new ArrayList<BasicHeader>();collection.add(new BasicHeader("Accept", "text/html, application/xhtml+xml, */*"));collection.add(new BasicHeader("Referer", "http://www.sina.com/"));collection.add(new BasicHeader("Accept-Language", "zh-CN"));collection.add(new BasicHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"));collection.add(new BasicHeader("Accept-Encoding", "gzip, deflate"));params.setParameter(ClientPNames.DEFAULT_HEADERS, collection);HttpClient httpclient = new DefaultHttpClient(params);// 下面内容略}// 多线程编程下的线程池设置(这点在需要登录且用一个HttpClient对象抓取多个页面的情况下特别有用)public void testConnectionManager() throws Exception {// 连接池设置SchemeRegistry schemeRegistry = new SchemeRegistry();schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));schemeRegistry.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory()));PoolingClientConnectionManager cm = new PoolingClientConnectionManager(schemeRegistry);cm.setMaxTotal(200); // 连接池里的最大连接数cm.setDefaultMaxPerRoute(20); // 每个路由的默认最大连接数HttpHost localhost = new HttpHost("locahost", 80); // 可以针对某特定网站指定最大连接数cm.setMaxPerRoute(new HttpRoute(localhost), 30);// 其它设置HttpParams params = new BasicHttpParams(); params.setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY);HttpClient httpclient = new DefaultHttpClient(cm, params);// 下面内容略}// 测试HTTP上下文对象(HttpContext)public void testContext() throws Exception {// 请求一个页面,然后解析各上下文对象DefaultHttpClient httpclient = new DefaultHttpClient();HttpContext localContext = new BasicHttpContext();HttpGet httpget = new HttpGet("http://www.baidu.com/");HttpResponse response = httpclient.execute(httpget, localContext);// the actual connection to the target server.HttpConnection conn = (HttpConnection) localContext.getAttribute(ExecutionContext.HTTP_CONNECTION); System.out.println("Socket timeout: " + conn.getSocketTimeout()); // the connection targetHttpHost target = (HttpHost) localContext.getAttribute(ExecutionContext.HTTP_TARGET_HOST);System.out.println("Final target: " + target);// the connection proxy, if used HttpHost proxy = (HttpHost) localContext.getAttribute(ExecutionContext.HTTP_PROXY_HOST);if (proxy != null)System.out.println("Proxy host/port: " + proxy.getHostName() + "/"+ proxy.getPort());// the actual HTTP requestHttpRequest request = (HttpRequest) localContext.getAttribute(ExecutionContext.HTTP_REQUEST);System.out.println("HTTP version: " + request.getProtocolVersion());Header[] headers = request.getAllHeaders();System.out.println("HTTP Headers: ");for (Header header : headers) {System.out.println("\t" + header.getName() + ": " + header.getValue());}System.out.println("HTTP URI: " + request.getRequestLine().getUri());// the actual HTTP responseresponse = (HttpResponse) localContext.getAttribute(ExecutionContext.HTTP_RESPONSE);HttpEntity entity = response.getEntity();if (entity != null) {System.out.println("Content Encoding:" + entity.getContentEncoding());System.out.println("Content Type:" + entity.getContentType());}// the flag indicating whether the actual request has been fully transmitted to the connection target. System.out.println("Sent flag: " + localContext.getAttribute(ExecutionContext.HTTP_REQ_SENT));// 如果没有用到返回entity中的内容,那么要把它消费掉,以保证底层的资源得以释放。entity = response.getEntity();EntityUtils.consume(entity);} public static void main(String[] args) throws Exception {HttpClientSample1 ins = new HttpClientSample1();// ins.grabPageHTML(); // ins.downloadFile();ins.login2Lashou(); // ins.testContext();} }
转载于:https://www.cnblogs.com/shihaiming/p/7657012.html
Java:HttpClient篇,HttpClient4.2在Java中的几则应用:Get、Post参数、Session(会话)保持、Proxy(代理服务器)设置,多线程设置......相关推荐
- Java进阶篇(五)——Java的I/O技术
程序中,为了永久的保存创建的数据,需要将其保存在磁盘文件中,以便在其它程序中使用它们.Java的I/O技术可以将数据保存到文本文件.二进制文件甚至是ZIP压缩文件中,以达到永久性保存数据的要求. 本篇 ...
- [JAVA实战篇] AES加密的JAVA实现及AES算法讲解
AES加密算法原理 1. S-P结构加密 AES加密算法是2001年由美国提出的互联网加密算法,从密码学的角度来讲,AES是典型的S-P结构加密.什么是S-P结构加密呢,手残博主画了一张图帮助大家理解 ...
- java提高篇四_(转)java提高篇(四)-----理解java的三大特性之多态
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
- Java入门篇 2021/02/22
Java入门篇 2021/02/22 Java的三大版本 java三大版本主要包括 JavaSE, JavaME, JavaEE,其中现如今的JavaME已经是很少见了,JavaSE是JavaEE的基 ...
- Java JDBC篇1——初识JDBC
Java JDBC篇1--初识JDBC Java DataBase Connectivity Java 数据库连接(Java语言操作数据库) 1.什么是JDBC 其实是官方定义的一套操作所有关系型数据 ...
- 菜鸟学习笔记:Java基础篇2(变量、运算符、流程控制语句、方法)
菜鸟学习笔记:Java基础篇2 变量 基本概念 变量作用域 final关键字 运算符 算术运算符 比较运算符 逻辑运算符 位运算符 赋值运算符 条件运算符 运算符优先级 Java三种流程控制语句 顺序 ...
- Java 基础篇(一)基本概念
Java 基础篇系列文章目录 Java 基础篇(一)基本概念 Java 基础篇(二)数据类型 Java 基础篇(三)控制逻辑 文章目录 Java 基础篇系列文章目录 Java(软件开发) Java(编 ...
- Java提高篇(三四)-----fail-fast机制
Java提高篇(三四)-----fail-fast机制 在JDK的Collection中我们时常会看到类似于这样的话: 例如,ArrayList: 注意,迭代器的快速失败行为无法得到保证,因为一般来说 ...
- java 反射机制_基础篇:深入解析JAVA反射机制
反射的概念 java 的放射机制:在程序运行时,程序有能力获取一个类的所有方法和属性:并且对于任意一个对象,可以调用它的任意方法或者获取其属性 通俗解析:java 文件需要编译成. class 文件才 ...
- 深入理解 Java 虚拟机(第一弹) - Java 内存区域透彻分析
来自:好好学java 这篇文章主要介绍Java内存区域,也是作为Java虚拟机的一些最基本的知识,理解了这些知识之后,才能更好的进行Jvm调优或者更加深入的学习,本来这些知识是晦涩难懂的,所以希望能够 ...
最新文章
- 95 后哈佛小哥撰写《从零开始的机器学习》,入门必备,书籍资源已开放
- Android studio 使用NDK工具实现JNI编程
- DockerFile和DockerCompose使用总结
- JMeter基础之—录制脚本
- c语言 葬礼分号,其实从C语言用分号结尾开始,就是一个悲剧了……
- openssl 加密解密 指令_Shell openssl命令加密解密字符串
- mapinfo图层导入奥维_(通信技能分享)怎样把谷歌地球上画的路线图导入到测试软件中!...
- HYSBZ 2145	悄悄话
- ANDROID_SDK_HOME的设置
- windows电脑自动安装第三方软件-联想客服建议解决办法
- 如何在 Linux 中找到你的 公网IP 地址
- 计算机网络在物流领域的应用研究,计算机网络技术在物流经济领域中的应用特点及其作用.doc...
- Android 中文API (69) —— BluetoothAdapter[蓝牙]
- 使用darknet批量测试图片并保存在指定文件夹下
- css 电子数字字体
- 第22节 软件工程知识
- ubuntu下QQ无法登录解决。
- 关于我玩单片机学习路线(个人总结)
- bulter机器人_机器人库早报|特拉华大学通过人工智能扩大发展劳动力 1.5 倍
- 通过双网卡电脑将网络共享到路由器
热门文章
- python爬取景点数据看该去哪里玩——南京篇
- Pytorch搭建DenseNet
- ubuntu中vim编辑器的安装与基本使用
- TMGM外汇平台官网最全测评(2022年版)
- 文本分析软件-智分析 SmartAnalyze
- 实用工具【SqlPrompt】 【Subline】 【XMind】 【PhotoShop】 【TakeColor】 【Q+】本次只讨论SqlPrompt...
- 关于解决vensim9.2版本无法显示中文的办法
- Java 实战项目坦克大战,一小时学会制作
- 计算机组成原理 王道考研2021 第一章:计算机组成原理概述 -- 计算机硬件的基本组成、认识各个硬件部分
- SolidWorks2020无法获得下列许可SOLIDWORKS Standard.Server节点已经关闭或是没有响应。(-96,7,11003)