Java网络编程(三)HttpUrlConnection与HttpClient详解(雷惊风)

合集下载

Java中常用的网络编程库和工具介绍

Java中常用的网络编程库和工具介绍

Java中常用的网络编程库和工具介绍在当今互联网时代,网络编程成为了软件开发中不可或缺的一部分。

Java作为一种广泛应用的编程语言,拥有丰富的网络编程库和工具,为开发者提供了便捷的网络编程解决方案。

本文将介绍一些常用的Java网络编程库和工具。

一、SocketSocket是Java中最基本、最底层的网络编程工具之一。

它提供了一种用于网络通信的机制,通过TCP或UDP协议实现数据的传输。

使用Socket可以方便地创建客户端和服务器端的网络连接,并进行数据的读写操作。

Socket的使用相对较底层,需要开发者自行处理数据的拆分和组装,适合对网络编程有一定了解的开发者使用。

二、NIO(New IO)NIO是Java提供的一种新的I/O模型,相对于传统的阻塞式I/O,NIO提供了更高效的I/O操作方式。

NIO中的核心概念是通道(Channel)和缓冲区(Buffer),通过使用Selector来实现非阻塞式的I/O操作。

NIO的优势在于可以同时处理多个连接,提高了系统的并发性能。

NIO适用于需要高并发处理的网络编程场景,如服务器开发。

三、NettyNetty是一个基于NIO的高性能网络编程框架,它提供了一系列的抽象和组件,简化了网络编程的复杂性。

Netty的设计目标是提供快速、简单、可靠的网络编程解决方案,广泛应用于服务器开发、分布式系统、游戏开发等领域。

Netty提供了事件驱动、异步的编程模型,使得开发者可以方便地处理大量的并发连接和高并发请求。

四、Apache HttpClientApache HttpClient是一个功能强大的HTTP客户端库,用于发送HTTP请求和接收HTTP响应。

它支持各种HTTP协议,包括HTTP/1.1、HTTP/2和WebSocket 等。

HttpClient提供了简洁的API,使得开发者可以轻松地进行HTTP通信。

它可以用于编写爬虫、访问Web服务、模拟用户行为等场景。

记录一下JAVA环境下如何在代理下使用HttpURLConnection

记录一下JAVA环境下如何在代理下使用HttpURLConnection

记录一下JAVA环境下如何在代理下使用HttpURLConnectionProperties prop = System.getProperties();// 设置http访问要使用的代理服务器的地址prop.setProperty("http.proxyHost", "代理服务器地址");// 设置http访问要使用的代理服务器的端口prop.setProperty("http.proxyPort", "代理服务器的端口");// 设置http访问要使用的代理服务器的用户名prop.setProperty("http.proxyUser", "用户名");// 设置http访问要使用的代理服务器的密码prop.setProperty("http.proxyPassword", "密码");用Java编写通过代理访问的应用程序本技巧将向您讲述如何编写可通过代理访问因特网上的Web服务器的Java应用程序。

在Java应用程序中加入代理支持只需额外编写几行代码,且不依赖任何安全性“漏洞”。

几乎所有的公司都十分关注保护自己的内部网络,以防黑客及入窃者。

一种常见的安全措施是完全断开与因特网的连接。

如果黑客们不能连接到您的任何一台机器,他们就不能非法进入您的系统。

这种策略产生的不利副作用是,内部用户无法访问外部的因特网服务器,如Yahoo或JavaWorld。

为了解决这一问题,网络管理员通常安装“代理服务器”。

实际上,代理是安装于因特网和内部网之间的一种服务,用来管理这两个领域之间的连接。

代理有助于减少安全性的外部威胁,同时还允许内部用户访问因特网服务。

尽管Java使得编写因特网客户机不再困难,但是如果客户机不能通过代理,则它们毫无用处。

幸运的是,Java使得使用代理支持不再困难--如果您知道密诀,这就是事实。

JavahttpClient介绍以及使用示例

JavahttpClient介绍以及使用示例

JavahttpClient介绍以及使⽤⽰例Java 开发语⾔中实现HTTP请求的⽅法主要有两种:⼀种是JAVA的标准类HttpUrlConnection,⽐较原⽣的实现⽅法;另⼀种是第三⽅开源框架HTTPClient。

HttpClient相⽐传统JDK⾃带的URLConnection,增加了易⽤性和灵活性,它不仅是客户端发送Http请求变得容易,⽽且也⽅便了开发⼈员测试接⼝(基于Http协议的),即提⾼了开发的效率,也⽅便提⾼代码的健壮性。

⼀、HttpClient简单介绍HttpClient是Apache Jakarta Common下的⼦项⽬,⽤来提供⾼效的、最新的、功能丰富的⽀持HTTP协议的客户端编程⼯具包,并且它⽀持HTTP协议最新的版本和建议。

HttpClient已经应⽤在很多的项⽬中,⽐如Apache Jakarta上很著名的另外两个开源项⽬Cactus和HTMLUnit都使⽤了HttpClient。

HTTPClient对HTTP的封装性⽐较不错,通过它基本上能够满⾜我们⼤部分的需求。

HttpClient3.1 是mons.httpclient下操作远程 url的⼯具包,虽然已不再更新,但实现⼯作中使⽤httpClient3.1的代码还是很多。

HttpClient4.5 是org.apache.http.client下操作远程 url的⼯具包。

⼆、HttpClient特性基于标准、纯净的java语⾔。

实现了Http1.0和Http1.1。

以可扩展的⾯向对象的结构实现了Http全部的⽅法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。

⽀持HTTPS协议。

通过Http代理建⽴透明的连接。

利⽤CONNECT⽅法通过Http代理建⽴隧道的https连接。

Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证⽅案。

【推荐下载】Android网络访问之HttpURLConnection和HttpClient

【推荐下载】Android网络访问之HttpURLConnection和HttpClient

Android 网络访问之HttpURLConnection 和HttpClient 2015/05/23 4 Android 上发送HTTP 请求的一般有两种方式,HttpURLConnection 和HttpClient。

下面分别简述两种方式的用法。

1. HttpURLConnection1, 获取HttpURLConnection 的实例。

一般只需new 出一个URL 对象,并传入目标的网络地址,然后调用openConnection()方法即可。

如下所示:URL url = new URL(“baidu”);HttpURLConnection connection = (HttpURLConnection) url.openConnection();2, 设置HTTP 请求方法。

常用的方法有两个:GET 和POST。

GET 表示希望从服务器那里获取数据,而POST 则表示希望提交数据给服务器。

写法如下:connection.setRequestMethod(“GET”);3,其他设置,如设置连接超时、读取超时的毫秒数等。

可根据实际情况来写,例如:connection.setConnectTimeout(5000);// 设置连接超时为5000 毫秒connection.setReadTimeout(5000);4, 用getInputStream() 方法获取服务器返回的输入流,然后读取输入流。

代码如下所示:InputStream in = connection.getInputStream();5, 关闭HTTP 连接connection.disconnect();MainActivity 代码实现:public class MainActivity extends Activity implements OnClickListener { public static final int SHOW_RESPONSE = 0; private Button sendRequest; private TextView responseText; private Handler handler = new Handler() { public void handleMessage(Message msg) { switch(msg.what) { case SHOW_RESPONSE: Stringresponse = (String) msg.obj; // 在这里进行UI 操作,将结果显示到界面上responseText.setText(response); } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(yout.activity_main); sendRequest = (Button) findViewById(R.id.send_request); responseText = (TextView)。

Android网络连接之HttpURLConnection和HttpClient

Android网络连接之HttpURLConnection和HttpClient

Android网络连接之HttpURLConnection和HttpClient1.概念HTTP 协议可能是现在Internet 上使用得最多、最重要的协议了,越来越多的Java 应用程序需要直接通过HTTP 协议来访问网络资源。

在JDK 的 包中已经提供了访问HTTP协议的基本功能:HttpURLConnection。

但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。

除此之外,在Android中,androidSDK中集成了Apache的HttpClient模块,用来提供高效的、最新的、功能丰富的支持HTTP 协议工具包,并且它支持HTTP 协议最新的版本和建议。

使用HttpClient可以快速开发出功能强大的Http程序。

2.区别HttpClient是个很不错的开源框架,封装了访问http的请求头,参数,内容体,响应等等,HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便,比如重访问的自定义,以及一些高级功能等。

URLConnectionProxies and SOCKS Full support in Netscape browser, appletviewer, and applicat additional limitations from security policies.Authorization Full support for Basic Authorization in Netscape (can use in accesses outside of the applet); no support in appletviewer orMethods Only has GET and POST.Headers Currently you can only set any request headers if you are doing and the JDK you can't set any headers.Under Netscape 3.0 you can read headers only if the resource w header; if no Content-length header was returned, or under using the JDK no headers can be read.Automatic Redirection Handling Yes.Persistent Connections No support currently in JDK; under Netscape uses HTTP/1.0 K Pipelining of Requests No.Can handle protocols other than HTTP Theoretically; however only http is currently implemented.Can do HTTP over SSL (https)Under Netscape, yes. Using Appletviewer or in an application, Source code available No.3.案例URLConnectionString urlAddress = "http://192.168.1.102:8080/AndroidServer/login.do";URL url;HttpURLConnection uRLConnection;public UrlConnectionToServer(){}//向服务器发送get请求public String doGet(String username,String password){String getUrl = urlAddress + "?username="+username+"&password="+password;try {url = new URL(getUrl);uRLConnection = (HttpURLConnection)url.openConnection();InputStream is = uRLConnection.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));String response = "";String readLine = null;while((readLine =br.readLine()) != null){//response = br.readLine(); response = response +readLine;}is.close();br.close();uRLConnection.disconnect();return response;} catch (MalformedURLException e) {e.printStackTrace();return null;} catch (IOException e) {e.printStackTrace();return null;}}//向服务器发送post请求public String doPost(String username,String password){try {url = new URL(urlAddress);uRLConnection = (HttpURLConnection)url.openConnection();uRLConnection.setDoInput(true);uRLConnection.setDoOutput(true);uRLConnection.setRequestMethod("POST");uRLConnection.setUseCaches(false);uRLConnection.setInstanceFollowRedirects(false);uRLConnection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");uRLConnection.connect();DataOutputStream out = new DataOutputStream(uRLConnection.getOutputStream());String content = "username="+username+"&password="+password;out.writeBytes(content);out.flush();out.close();InputStream is = uRLConnection.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is)); String response = "";String readLine = null;while((readLine =br.readLine()) != null){//response = br.readLine(); response = response + readLine;}is.close();br.close();uRLConnection.disconnect();return response;} catch (MalformedURLException e) {e.printStackTrace();return null;} catch (IOException e) {e.printStackTrace();return null;}}HTTPClientString urlAddress = "http://192.168.1.102:8080/qualityserver/login.do"; public HttpClientServer(){}public String doGet(String username,String password){String getUrl = urlAddress + "?username="+username+"&password="+password; HttpGet httpGet = new HttpGet(getUrl);HttpParams hp = httpGet.getParams();hp.getParameter("true");//hp. //httpGet.setp HttpClient hc = new DefaultHttpClient();try {HttpResponse ht = hc.execute(httpGet);if(ht.getStatusLine().getStatusCode() == HttpStatus.SC_OK){HttpEntity he = ht.getEntity();InputStream is = he.getContent();BufferedReader br = new BufferedReader(new InputStreamReader(is)); String response = "";String readLine = null;while((readLine =br.readLine()) != null){//response = br.readLine(); response = response + readLine;}is.close();br.close();//String str = EntityUtils.toString(he); System.out.println("========="+response);return response;}else{return "error";}} catch (ClientProtocolException e) {//TODO Auto-generated catch block e.printStackTrace();return "exception";} catch (IOException e) {//TODO Auto-generated catch block e.printStackTrace();return "exception";}}public String doPost(String username,String password){//String getUrl = urlAddress + "?username="+username+"&password="+password; HttpPost httpPost = new HttpPost(urlAddress);List params = new ArrayList();NameValuePair pair1 = new BasicNameValuePair("username", username);NameValuePair pair2 = new BasicNameValuePair("password", password);params.add(pair1);params.add(pair2);HttpEntity he;try {he = new UrlEncodedFormEntity(params, "gbk");httpPost.setEntity(he);} catch (UnsupportedEncodingException e1) {//TODO Auto-generated catch block e1.printStackTrace();}HttpClient hc = new DefaultHttpClient();try {HttpResponse ht = hc.execute(httpPost);//连接成功if(ht.getStatusLine().getStatusCode() == HttpStatus.SC_OK){HttpEntity het = ht.getEntity();InputStream is = het.getContent();BufferedReader br = new BufferedReader(new InputStreamReader(is)); String response = "";String readLine = null;while((readLine =br.readLine()) != null){//response = br.readLine(); response = response + readLine;}is.close();br.close();//String str = EntityUtils.toString(he); System.out.println("=========&&"+response);return response;}else{return "error";}} catch (ClientProtocolException e) {//TODO Auto-generated catch block e.printStackTrace();return "exception";} catch (IOException e) {//TODO Auto-generated catch block e.printStackTrace();return "exception";}}servlet端json转化:resp.setContentType("text/json");resp.setCharacterEncoding("UTF-8");toDo = new ToDo();List<UserBean> list = new ArrayList<UserBean>();list = toDo.queryUsers(mySession);String body;//设定JSON JSONArray array = new JSONArray();for(UserBean bean : list){JSONObject obj = new JSONObject();try{obj.put("username", bean.getUserName());obj.put("password", bean.getPassWord());}catch(Exception e){}array.add(obj);}pw.write(array.toString());System.out.println(array.toString());android端接收:String urlAddress = "http://192.168.1.102:8080/qualityserver/result.do";String body =getContent(urlAddress);JSONArray array = new JSONArray(body);for(int i=0;i<array.length();i++){obj = array.getJSONObject(i);sb.append("用户名:").append(obj.getString("username")).append("\t"); sb.append("密码:").append(obj.getString("password")).append("\n");HashMap<String, Object> map = new HashMap<String, Object>();try {userName = obj.getString("username");passWord = obj.getString("password");} catch (JSONException e) {e.printStackTrace();}map.put("username", userName);map.put("password", passWord);listItem.add(map);}} catch (Exception e) {//TODO Auto-generated catch block e.printStackTrace(); }if(sb!=null){showResult.setText("用户名和密码信息:");showResult.setTextSize(20);} elseextracted();//设置adapter SimpleAdapter simple = new SimpleAdapter(this,listItem,yout.simple_list_item_2,new String[]{"username","password"},new int[]{android.R.id.text1,android.R.id.text2});listResult.setAdapter(simple);listResult.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {int positionId = (int) (id+1);Toast.makeText(MainActivity.this, "ID:"+positionId, Toast.LENGTH_LONG).show();}});}private void extracted() {showResult.setText("没有有效的数据!");}//和服务器连接private String getContent(String url)throws Exception{ StringBuilder sb = new StringBuilder();HttpClient client =new DefaultHttpClient();HttpParams httpParams =client.getParams();HttpConnectionParams.setConnectionTimeout(httpParams, 3000);HttpConnectionParams.setSoTimeout(httpParams, 5000);HttpResponse response = client.execute(new HttpGet(url));HttpEntity entity =response.getEntity();if(entity !=null){BufferedReader reader = new BufferedReader(new InputStreamReader (entity.getContent(),"UTF-8"),8192);String line =null;while ((line= reader.readLine())!=null){sb.append(line +"\n");}reader.close();}return sb.toString();}分类: Android之网络编程。

使用HttpURLConnection访问网络

使用HttpURLConnection访问网络

使用HttpURLConnection访问网络HttpURLConnection是Java提供的一种用于HTTP协议通信的类,可以用来进行网络请求和数据传输。

它是基于Java的URL类的扩展,提供了更多的功能和灵活性。

1.创建一个URL对象,用于指定要访问的URL地址。

2. 调用URL对象的openConnection(方法来创建一个HttpURLConnection对象。

3. 设置HttpURLConnection对象的请求方法、超时时间、请求头等属性。

4. 调用HttpURLConnection对象的connect(方法来建立与服务器的连接。

5.发送请求参数(如果有的话)。

6. 调用HttpURLConnection对象的getResponseCode(方法来获取服务器的响应码。

7.根据响应码进行相应的处理,如获取服务器返回的数据。

8.关闭连接。

下面是一个使用HttpURLConnection进行网络请求的示例代码:```javaimport java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class HttpURLConnectionExamplepublic static void main(String[] args)try//创建一个URL对象// 创建一个HttpURLConnection对象HttpURLConnection connection = (HttpURLConnection) url.openConnection(;//设置请求方法connection.setRequestMethod("GET");//设置超时时间connection.setConnectTimeout(5000);connection.setReadTimeout(5000);//发送请求connection.connect(;//获取响应码int responseCode = connection.getResponseCode(;System.out.println("Response Code: " + responseCode);if (responseCode == HttpURLConnection.HTTP_OK)//读取服务器返回的数据BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream());String line;StringBuilder response = new StringBuilder(;while ((line = reader.readLine() != null)response.append(line);}reader.close(;//打印服务器返回的数据System.out.println("Response: " + response.toString();} elseSystem.out.println("Error: " + responseCode);}//关闭连接connection.disconnect(;} catch (IOException e)e.printStackTrace(;}}```上述代码中,我们创建了一个URL对象来指定要访问的URL地址。

Java调用Http请求 -HttpURLConnection

Java调用Http请求 -HttpURLConnection

Java调用Http请求-HttpURLConnectionJava中为我们的网络支持提供了包,能够使我们以编程的方式来访问Web服务功能, Java中的网络编程的知识,主要是学习下该包下的API。

URI——>URLURI:表示的是统一的资源标识,它是以某种统一的方式标识资源的简单字符串。

这种字符串以scheme开头。

URL:表示统一的资源定位器的任务,URL是一种URI。

URN:一般不能为资源提供持久不变的名称,这是统一的资源命名的任务。

URN也是一种URI,但它是全球唯一的、持久不变的,即使资源不再存在或不再使用。

URL类URL类代表一个统一资源定位符,资源可以是简单的目录,也可以是复杂的对象,例如对数据库或搜索引擎的查询。

URL类为我们提供了不同的构造方法1.根据地址构造URLPublicURL(Stringspec);URL url=new URL("")2.根据协议、主机名、端口和文件创造public URL(String protocol,Stringhost,intport,String file)URL封装对象信息URL对象封装了一些对象的信息,比如URL对象的端口号、头内容、主机名、协议名称等HTTP请求的细节——请求行请求行中的GET称之为请求方式,请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT,常用的有: GET、 POST用户如果没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。

不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:如果请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:GET /mail/1.html?name=abc&password=xyz HTTP/1.1。

JavaHttpURLConnection抓取网页内容解析gzip格式输入流数据并转换为S。。。

JavaHttpURLConnection抓取网页内容解析gzip格式输入流数据并转换为S。。。

JavaHttpURLConnection抓取⽹页内容解析gzip格式输⼊流数据并转换为S。

最近GFW为了刷存在感,搞得⼤家是头晕眼花,修改hosts ⼏乎成了每⽇必备⼯作。

索性写了⼀个⼩程序,给办公室的同事们分享,其中有个内容就是抓取⽹络上的hosts,废了⼀些周折。

我是在⼀个博客上抓取的。

但是这位朋友的博客应该是在做防盗链,但他的⽅式⽐较简单就是5位数的⼀个整形随机数。

这⾥折腾⼀下就ok了。

要命的是他这个链接的流类型居然是gzip。

这个郁闷好久,⼀直以为是编码格式导致解析不出来结果,后来发现是gzip搞的。

主要的⼀段代码做个记录吧。

1/**2 * ⽹络⼯具类⽤于抓取上的hosts数据3 *4 * @author tone5*/6public class NetUtil {78private final static String ENCODING = "UTF-8";9private final static String GZIPCODING = "gzip";10private final static String HOST = "/pub/hosts.php";11private final static String COOKIE = "hostspasscode=%s; Hm_lvt_e26a7cd6079c926259ded8f19369bf0b=1421846509,1421846927,1421847015,1421849633; Hm_lpvt_e26a7cd6079c926259ded8f19369bf0b=1421849633" 12private final static String OFF = "off";13private final static String ON = "on";14private final static int RANDOM = 100000;15private static String hostspasscode = null;16private static NetUtil instance;1718public static NetUtil getInstance() {19if (instance == null) {20 instance = new NetUtil();21 }22return instance;23 }2425private NetUtil() {26 hostspasscode = createRandomCookies();27 }2829/**30 * 获取html内容31 *32 * @param gs33 * @param wk34 * @param twttr35 * @param fb36 * @param flkr37 * @param dpbx38 * @param odrvB39 * @param yt40 * @param nohl41 * @return42*/43public String getHtmlInfo(boolean gs, boolean wk, boolean twttr, boolean fb,44boolean flkr, boolean dpbx, boolean odrv,45boolean yt, boolean nohl) throws Exception {46 HttpURLConnection conn = null;4748 String result = "";4950//String cookie = "hostspasscode="+hostspasscode+"; Hm_lvt_e26a7cd6079c926259ded8f19369bf0b=1421846509,1421846927,1421847015,1421849633; Hm_lpvt_e26a7cd6079c926259ded8f19369bf0b=1421849633";51 String cookie = String.format(COOKIE, hostspasscode);5253//URL url = new URL("/pub/hosts.php?passcode=13008&gs=on&wk=on&twttr=on&fb=on&flkr=on&dpbx=on&odrv=on&yt=on&nolh=on");54 URL url = new URL(createUrl(hostspasscode, gs, wk, twttr, fb, flkr, dpbx, odrv, yt, nohl));55//System.out.println(cookie);56// System.out.println(url.toString());5758 conn = (HttpURLConnection) url.openConnection();5960 conn.setConnectTimeout(5 * 1000);61 conn.setDoOutput(true);62//get⽅式提交63 conn.setRequestMethod("GET");64//凭借请求头⽂件65 conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");66 conn.setRequestProperty("Accept-Encoding", "gzip, deflate");67 conn.setRequestProperty("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");68 conn.setRequestProperty("Connection", "keep-alive");69 conn.setRequestProperty("Cookie", cookie);70 conn.setRequestProperty("Host", "");71 conn.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0");7273// conn.setRequestProperty("Referer", "/pub/gethosts.php");74// conn.setRequestProperty("X-Requested-With", "XMLHttpRequest");7576 conn.connect();7778 String encoding = conn.getContentEncoding();7980 result = readStream(conn.getInputStream(), encoding);81//测试进度条显⽰82// result = readStream(new FileInputStream(new File("/home/tone/Resident.Evil.Damnation.2012.1080p.BluRay.x264.DTS-WiKi.mkv")), "11");8384 conn.disconnect();85if (nohl) {86 result=getLocalHost()+result;87 }8889return result;90 }9192/**93 * 读取将InputStream中的字节读以字符的形式取到字符串中,如果encoding是gzip,那么需要先有GZIPInputStream进⾏封装95 * @param inputStream InputStream字节流96 * @param encoding 编码格式97 * @return String类型的形式98 * @throws IOException IO异常99*/100private String readStream(InputStream inputStream, String encoding) throws Exception {101 StringBuffer buffer = new StringBuffer();102 ProgressMonitorInputStream pmis = null;103104 InputStreamReader inputStreamReader = null;105 GZIPInputStream gZIPInputStream = null;106if (GZIPCODING.equals(encoding)) {107 gZIPInputStream = new GZIPInputStream(inputStream);108 inputStreamReader = new InputStreamReader(ProgressUtil.getMonitorInputStream(gZIPInputStream, "获取⽹络数据"), ENCODING); 109110 } else {111112 inputStreamReader = new InputStreamReader(ProgressUtil.getMonitorInputStream(inputStream, "获取⽹络数据"), ENCODING); 113 }114115116char[] c = new char[1024];117118int lenI;119while ((lenI = inputStreamReader.read(c)) != -1) {120121 buffer.append(new String(c, 0, lenI));122123 }124if (inputStream != null) {125 inputStream.close();126 }127if (gZIPInputStream != null) {128 gZIPInputStream.close();129 }130if (pmis!=null) {131 gZIPInputStream.close();132 }133134135return buffer.toString();136137138 }139140/**141 * ⽣成随机Cookies数组142 *143 * @return五位随机数字144*/145private String createRandomCookies() {146147return String.valueOf(Math.random() * RANDOM).substring(0, 5);148149 }150151/**152 * ⽣成链接字符串153 *154 * @param hostspasscode155 * @param gs156 * @param wk157 * @param twttr158 * @param fb159 * @param flkr160 * @param dpbx161 * @param odrvB162 * @param yt163 * @param nohl164 * @return165*/166private String createUrl(String hostspasscode, boolean gs, boolean wk, boolean twttr, boolean fb,167boolean flkr, boolean dpbx, boolean odrv,168boolean yt, boolean nohl) {169 StringBuffer buffer = new StringBuffer();170 buffer.append(HOST);171 buffer.append("?passcode=" + hostspasscode);172if (gs) {173 buffer.append("&gs=" + ON);174 } else {175 buffer.append("&gs=" + OFF);176 }177if (wk) {178 buffer.append("&wk=" + ON);179 } else {180 buffer.append("&wk=" + OFF);181 }182if (twttr) {183 buffer.append("&twttr=" + ON);184 } else {185 buffer.append("&twttr=" + OFF);186 }187if (fb) {188 buffer.append("&fb=" + ON);189 } else {190 buffer.append("&fb=" + OFF);191 }192if (flkr) {193 buffer.append("&flkr=" + ON);194 } else {195 buffer.append("&flkr=" + OFF);196 }197if (dpbx) {198 buffer.append("&dpbx=" + ON);199 } else {200 buffer.append("&dpbx=" + OFF);201 }202if (odrv) {203 buffer.append("&odrv=" + ON);204 } else {205 buffer.append("&odrv=" + OFF);207if (yt) {208 buffer.append("&yt=" + ON);209 } else {210 buffer.append("&yt=" + OFF);211 }212if (nohl) {213 buffer.append("&nohl=" + ON);214 } else {215 buffer.append("&nohl=" + OFF);216 }217return buffer.toString();218 }219220private String getLocalHost() throws Exception {221222 StringBuffer buffer=new StringBuffer();223 String hostName=OSUtil.getInstance().getLocalhostName(); 224 buffer.append("#LOCALHOST begin"+"\n");225 buffer.append("127.0.0.1\tlocalhost"+"\n");226if (hostName!=null&&!"".equals(hostName)) {227 buffer.append("127.0.1.1\t"+hostName+"\n");228 }229230 buffer.append("#LOCALHOST end"+"\n");231return buffer.toString();232233234235 }236237 }。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

HttpUrlConnection与HttpClient详解一.概念。

在Android开发中,AndroidSDK中对HTTP提供了很好的支持,主要包括两种接口。

1.一个是Sun公司提供的库,基于标准Java接口的HttpURLConnection,这个类封装的很少,如果使用高级功能,如重访问/Cookie/Session等就相当不方便。

它可以实现简单的基于URL的请求与相应功能。

Google在AndroidApi23及以后的版本中推荐使用HttpURLConnention,在后续版本中逐渐对其进行优化完善。

在2.2版本以前,一直存在着一些bug。

比如对一个可读的InputStream调用close方法时,可能会导致连接池失效。

通常我们会禁用连接池功能。

2.另一个是Apache公司提供的的HttpClient,它提供了高效的,最新的功能丰富的api,支持Http协议工具包,支持HTTP最新版本和建议,是个很好的开源框架,封装了http的请求,参数,内容体,响应等,拥有众多API,但同时HttpClient的API数量太多,如果不破坏兼容性的情况下想对他进行扩展很麻烦。

在API 23 SDK将其去掉了。

建议使用HttpURLConnection。

以上两种联网方式都支持HTTPS协议、以流的形式进行传输、IPv6、配置超时时间、以及连接池等功能。

二.区别。

1.功能上,HttpClient库要丰富很多,提供了很多工具,封装了http的请求头,参数,内容体,响应,还有一些高级功能,代理、COOKIE、鉴权、压缩、连接池的处理。

2.H ttpClient高级功能代码写起来比较复杂,对开发人员的要求会高一些,而HttpURLConnection对大部分工作进行了包装,屏蔽了不需要的细节,适合开发人员直接调用。

3.HttpURLConnection在2.3版本增加了一些HTTPS方面的改进,4.0版本增加一些响应的缓存。

4.HttpUrlConnection直接支持GZIP压缩;HttpClient也支持,但要自己写代码处理。

5.HttpUrlConnection直接支持系统级连接池,即打开的连接不会直接关闭,在一段时间内所有程序可共用;HttpClient当然也能做到,但毕竟不如官方直接系统底层支持好。

6.HttpUrlConnection直接在系统层面做了缓存策略处理(4.0版本以上),加快了重复请求的速度。

7.HttpClient 适用于web browsers, 他们是可扩展的,并且拥有大量的稳定APIs。

但是,在不破坏其兼容性的前提下很难对如此多的APIs做修改。

因此,Android 团队对修改优化Apache HTTP Client表现的并不积极。

8.HttpURLConnect 是一个通用的、适合大多数应用的轻量级组件。

这个类起步比较晚,很容易在主要API上做稳步的改善。

但是HttpURLConnection在在Android 2.2及以下版本上存在一些令人厌烦的bug,尤其是在读取InputStream时调用close()方法,就有可能会导致连接池失效了。

9.Android团队未来的工作会将更多的时间放在优化HttpURLConnection上,它的API简单,体积较小,因而非常适用于Android项目。

压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。

10.如果一个Android应用需要向指定页面发送请求,但该页面并不是一个简单的页面,只有当用户已经登录,而且登录用户的用户名有效时才可访问该页面。

如果使用HttpURLConnection来访问这个被保护的页面,那么需要处理的细节就太复杂了。

这种情况建议使用HttpClient。

11.Android2.3及以上版本建议选用HttpURLConnection,2.2及以下版本建议选用HttpClient。

新的应用都建议使用HttpURLConnection。

三.HttpClient访问网络流程。

由于在Android2.2以后版本中已经将HttpClient弃用,所以不在这里详细说明如何使用HttpClient进行网络通信了,下面说一下使用HttpClient发送请求及接收响应的大概步骤:1.创建HttpClient。

2.创建HttpGet或者HttpPost对象(分别对应get,post方式)。

3.调用HttpGet或者HttpPost的setParams()方法设置请求参数,如果是HttpPost,还可以通过setEntity()方式设置请求参数。

4.调用HttpCLient的excute(HttpUriRquest request)方法发送请求。

会返回一个HttpResponse对象。

5.HttpRespsonse的getHeaders(String name)与getAllHeaders()方法获取服务端返回的响应头,还可以调用HttpResponse的getEntity()方法获取相应对象,该对象包装了服务端的返回内容。

我们可以从中进行读取。

四.HttpURLConnetion类get与post实现1.get方式访问百度网站package com.lyl.demo;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import .HttpURLConnection;import .URL;public class Comparison {public static void main(String[] args) {String reString=urlConnectionGet("");System.out.println(reString);}public static String urlConnectionGet(String path){try {URL url = new URL(path.trim());//打开连接HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();if(200 == urlConnection.getResponseCode()){//得到输入流InputStream is =urlConnection.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while(-1 != (len = is.read(buffer))){baos.write(buffer,0,len);baos.flush();}return baos.toString("utf-8");}} catch (IOException e) {e.printStackTrace();}return null;}}2.post方式package com.lyl.demo;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .HttpURLConnection;import .MalformedURLException;import .URL;public class PostMethod {public static void main(String[] args) {httpPost();}public static void httpPost() {try {URL url = new URL("");HttpURLConnection connection = (HttpURLConnection) url .openConnection();connection.setConnectTimeout(5 * 1000);connection.setReadTimeout(5 * 1000);connection.setDoOutput(true);connection.setDoInput(true);connection.setUseCaches(false);connection.setRequestMethod("POST");//connection.setRequestProperty("Connection","keep-Alive");connection.setRequestProperty("Charset", "utf-8");//connection.setRequestProperty("Content-type","application/x-www-");String params = "page = 1 & num = 10";OutputStream os = connection.getOutputStream();os.write(params.getBytes());os.flush();os.close();if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {InputStream is = connection.getInputStream();StringBuilder sb = new StringBuilder();byte[] bytes = new byte[1024];int i = 0;while ((i = is.read(bytes)) != -1) {sb.append(new String(bytes, 0, i, "utf-8"));}is.close();System.out.println("LYL_read:" + sb);}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}五.参考文献1./liushuibufu/p/4140913.html。

相关文档
最新文档