⑴ 什麼時候需要利用httpurlconnection對象和internet交互
分析一:
在研究Volley框架的源碼中,發現它在HTTP請求的使用上比較有意思,在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及以下版本,使用的是HttpClient。我也比較好奇這么使用的原因,於是專門找到了一位Google的工程師寫的一篇博客,文中對HttpURLConnection和HttpClient進行了對比,下面我就給大家簡要地翻譯一下。
大多數的Android應用程序都會使用HTTP協議來發送和接收網路數據,而Android中主要提供了兩種方式來進行HTTP操作,HttpURLConnection和HttpClient。這兩種方式都支持HTTPS協議、以流的形式進行上傳和下載、配置超時時間、IPv6、以及連接池等功能。
HttpClient:
DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具體的實現類,它們都擁有眾多的API,而且實現比較穩定,bug數量也很少。
但同時也由於HttpClient的API數量過多,使得我們很難在不破壞兼容性的情況下對它進行升級和擴展,所以目前Android團隊在提升和優化HttpClient方面的工作態度並不積極。
HttpURLConnection:
HttpURLConnection是一種多用途、輕量極的HTTP客戶端,使用它來進行HTTP操作可以適用於大多數的應用程序。雖然HttpURLConnection的API提供的比較簡單,但是同時這也使得我們可以更加容易地去使用和擴展它。
不過在Android 2.2版本之前,HttpURLConnection一直存在著一些令人厭煩的bug。比如說對一個可讀的InputStream調用close()方法時,就有可能會導致連接池失效了。那麼我們通常的解決辦法就是直接禁用掉連接池的功能:
[java] view plain
[java] view plain
private void () {
// 這是一個2.2版本之前的bug
if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
System.setProperty("http.keepAlive", "false");
}
}
配置你的Web伺服器來支持對客戶端的響應進行壓縮的功能,從而可以在這一改進上獲取到最大的好處。如果在壓縮響應的時候出現了問題,這篇文檔會告訴你如何禁用掉這個功能。
但是如果啟動了響應壓縮的功能,HTTP響應頭里的Content-Length就會代表著壓縮後的長度,這時再使用getContentLength()方法來取出解壓後的數據就是錯誤的了。正確的做法應該是一直調用InputStream.read()方法來讀取響應數據,一直到出現-1為止。
我們在Android 2.3版本中還增加了一些HTTPS方面的改進,現在HttpsURLConnection會使用SNI(Server Name Indication)的方式進行連接,使得多個HTTPS主機可以共享同一個IP地址。除此之外,還增加了一些壓縮和會話的機制。如果連接失敗,它會自動去嘗試重新進行連接。這使得HttpsURLConnection可以在不破壞老版本兼容性的前提下,更加高效地連接最新的伺服器。
在Android 4.0版本中,我們又添加了一些響應的緩存機制。當緩存被安裝後(調用HttpResponseCache的install()方法),所有的HTTP請求都會滿足以下三種情況:
所有的緩存響應都由本地存儲來提供。因為沒有必要去發起任務的網路連接請求,所有的響應都可以立刻獲取到。
視情況而定的緩存響應必須要有伺服器來進行更新檢查。比如說客戶端發起了一條類似於 「如果/foo.png這張圖片發生了改變,就將它發送給我」 這樣的請求,伺服器需要將更新後的數據進行返回,或者返回一個304 Not Modified狀態。如果請求的內容沒有發生,客戶端就不會下載任何數據。
沒有緩存的響應都是由伺服器直接提供的。這部分響應會在稍後存儲到響應緩存中。
由於這個功能是在4.0之後的版本才有的,通常我們就可以使用反射的方式來啟動響應緩存功能。下面的示例代碼展示了如何在Android 4.0及以後的版本中去啟用響應緩存的功能,同時還不會影響到之前的版本:
[java] view plain
[java] view plain
private void enableHttpResponseCache() {
try {
long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
File httpCacheDir = new File(getCacheDir(), "http");
Class.forName("android.net.http.HttpResponseCache")
.getMethod("install", File.class, long.class)
.invoke(null, httpCacheDir, httpCacheSize);
} catch (Exception httpResponseCacheNotAvailable) {
}
}
你也應該同時配置一下你的Web伺服器,在HTTP響應上加入緩存的消息頭。哪一種才是最好的?在Android 2.2版本之前,HttpClient擁有較少的bug,因此使用它是最好的選擇。
而在Android 2.3版本及以後,HttpURLConnection則是最佳的選擇。它的API簡單,體積較小,因而非常適用於Android項目。壓縮和緩存機制可以有效地減少網路訪問的流量,在提升速度和省電方面也起到了較大的作用。對於新的應用程序應該更加偏向於使用HttpURLConnection,因為在以後的工作當中我們也會將更多的時間放在優化HttpURLConnection上面。
分析二:
HTTP 協議可能是現在 Internet 上使用得最多、最重要的協議了,越來越多的 Java 應用程序需要直接通過 HTTP 協議來訪問網路資源。在 JDK 的 java.net 包中已經提供了訪問 HTTP 協議的基本功能:HttpURLConnection。
HttpURLConnection是java的標准類,HttpURLConnection繼承自URLConnection,可用於向指定網站發送GET請求、POST請求。它在URLConnection的基礎上提供了如下便捷的方法:
int getResponseCode():獲取伺服器的響應代碼。
String getResponseMessage():獲取伺服器的響應消息。
String getResponseMethod():獲取發送請求的方法。
void setRequestMethod(String method):設置發送請求的方法。
在一般情況下,如果只是需要Web站點的某個簡單頁面提交請求並獲取伺服器響應,HttpURLConnection完全可以勝任。但在絕大部分情況下,Web站點的網頁可能沒這么簡單,這些頁面並不是通過一個簡單的URL就可訪問的,可能需要用戶登錄而且具有相應的許可權才可訪問該頁面。在這種情況下,就需要涉及Session、Cookie的處理了,如果打算使用HttpURLConnection來處理這些細節,當然也是可能實現的,只是處理起來難度就大了。
為了更好地處理向Web站點請求,包括處理Session、Cookie等細節問題,Apache開源組織提供了一個HttpClient項目,看它的名稱就知道,它是一個簡單的HTTP客戶端(並不是瀏覽器),可以用於發送HTTP請求,接收HTTP響應。但不會緩存伺服器的響應,不能執行HTML頁面中嵌入的Javascript代碼;也不會對頁面內容進行任何解析、處理。
簡單來說,HttpClient就是一個增強版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection沒有提供的有些功能,HttpClient也提供了,但它只是關注於如何發送請求、接收
響應,以及管理HTTP連接。
使用HttpClient發送請求、接收響應很簡單,只要如下幾步即可。
創建HttpClient對象。
如果需要發送GET請求,創建HttpGet對象;如果需要發送POST請求,創建HttpPost對象。
如果需要發送請求參數,可調用HttpGet、HttpPost共同的setParams(HetpParams params)方法來添加請求參數;對於HttpPost對象而言,也可調用setEntity(HttpEntity entity)方法來設置請求參數。
調用HttpClient對象的execute(HttpUriRequest request)發送請求,執行該方法返回一個HttpResponse。
調用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取伺服器的響應頭;調用HttpResponse的getEntity()方法可獲取HttpEntity對象,該對象包裝了伺服器的響應內容。程序可通過該對象獲取伺服器的響應內容。
另外,Android已經成功地集成了HttpClient,這意味著開發人員可以直接在Android應用中使用Httpclient來訪問提交請求、接收響應。
比如一個Android應用需要向指定頁面發送請求,但該頁面並不是一個簡單的頁面,只有當用戶已經登錄,而且登錄用戶的用戶名有效時才可訪問該頁面。如果使用HttpURLConnection來訪問這個被保護的頁面,那麼需要處理的細節就太復雜了。
其實訪問Web應用中被保護的頁面,使用瀏覽器則十分簡單,用戶通過系統提供的登錄頁面登錄系統,瀏覽器會負責維護與伺服器之間的Sesion,如果用戶登錄的用戶名、密碼符合要求,就可以訪問被保護資源了。
在Android應用程序中,則可使用HttpClient來登錄系統,只要應用程序使用同一個HttpClient發送請求,HttpClient會自動維護與伺服器之間的Session狀態,也就是說程序第一次使用HttpClient登錄系統後,接下來使用HttpClient即可訪問被保護頁而了。
⑵ Java請求一個URL。獲取網站返回的數據。通過POST請求
packagewzh.Http;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.PrintWriter;
importjava.net.URL;
importjava.net.URLConnection;
importjava.util.List;
importjava.util.Map;
publicclassHttpRequest{
/**
*向指定URL發送GET方法的請求
*
*@paramurl
*發送請求的URL
*@paramparam
*請求參數,請求參數應該是name1=value1&name2=value2的形式。
*@returnURL所代表遠程資源的響應結果
*/
publicstaticStringsendGet(Stringurl,Stringparam){
Stringresult="";
BufferedReaderin=null;
try{
StringurlNameString=url+"?"+param;
URLrealUrl=newURL(urlNameString);
//打開和URL之間的連接
URLConnectionconnection=realUrl.openConnection();
//設置通用的請求屬性
connection.setRequestProperty("accept","*/*");
connection.setRequestProperty("connection","Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1)");
//建立實際的連接
connection.connect();
//獲取所有響應頭欄位
Map<String,List<String>>map=connection.getHeaderFields();
//遍歷所有的響應頭欄位
for(Stringkey:map.keySet()){
System.out.println(key+"--->"+map.get(key));
}
//定義BufferedReader輸入流來讀取URL的響應
in=newBufferedReader(newInputStreamReader(
connection.getInputStream()));
Stringline;
while((line=in.readLine())!=null){
result+=line;
}
}catch(Exceptione){
System.out.println("發送GET請求出現異常!"+e);
e.printStackTrace();
}
//使用finally塊來關閉輸入流
finally{
try{
if(in!=null){
in.close();
}
}catch(Exceptione2){
e2.printStackTrace();
}
}
returnresult;
}
/**
*向指定URL發送POST方法的請求
*
*@paramurl
*發送請求的URL
*@paramparam
*請求參數,請求參數應該是name1=value1&name2=value2的形式。
*@return所代表遠程資源的響應結果
*/
publicstaticStringsendPost(Stringurl,Stringparam){
PrintWriterout=null;
BufferedReaderin=null;
Stringresult="";
try{
URLrealUrl=newURL(url);
//打開和URL之間的連接
URLConnectionconn=realUrl.openConnection();
//設置通用的請求屬性
conn.setRequestProperty("accept","*/*");
conn.setRequestProperty("connection","Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1)");
//發送POST請求必須設置如下兩行
conn.setDoOutput(true);
conn.setDoInput(true);
//獲取URLConnection對象對應的輸出流
out=newPrintWriter(conn.getOutputStream());
//發送請求參數
out.print(param);
//flush輸出流的緩沖
out.flush();
//定義BufferedReader輸入流來讀取URL的響應
in=newBufferedReader(
newInputStreamReader(conn.getInputStream()));
Stringline;
while((line=in.readLine())!=null){
result+=line;
}
}catch(Exceptione){
System.out.println("發送POST請求出現異常!"+e);
e.printStackTrace();
}
//使用finally塊來關閉輸出流、輸入流
finally{
try{
if(out!=null){
out.close();
}
if(in!=null){
in.close();
}
}
catch(IOExceptionex){
ex.printStackTrace();
}
}
returnresult;
}
}
//函數調用時填入URL和參數(參數非必須)就可以獲取返回的數據,發送post請求調用示例
Stringresult=HttpRequest.sendPost("http://api.map..com/telematics/v3/weather?location=%E5%8C%97%E4%BA%AC&output=json&ak=","")
⑶ java 怎麼使用遠程 url 創建 file
importjava.io.BufferedReader;
importjava.io.File;
importjava.io.FileReader;
/**
*@authorlmq
*
*/
publicclassRemoteFile{
publicstaticvoidmain(String[]args)throwsException{
FileremoteFile=newFile("//192.168.7.146/test/1.txt");//192.168.7.146是對方機器IP,test是對方那個共享文件夾名字,如果沒有共享是訪問不到的
//遠程文件其實主要是地址,地址弄對了就和本地文件沒什麼區別,windows裡面//或者\\開頭就表示這個文件是網路路徑了其實這個地址就像我們再windows裡面,點擊開始
//然後點擊運行,然後輸入\192.168.7.146/test/1.txt訪問遠程文件一樣的
BufferedReaderbr=newBufferedReader(newFileReader(remoteFile));
Stringstr;
while((str=br.readLine())!=null){
System.out.println(str);
}
br.close();
}
}
如果是非共享文件 你只能通過url讀取流來生成了
publicvoiddownUrlTxt(StringfileName,StringfileUrl,StringdownPath){
FilesavePath=newFile(downPath);
if(!savePath.exists()){
savePath.mkdir();
}
String[]urlname=fileUrl.split("/");
intlen=urlname.length-1;
Stringuname=urlname[len];//獲取文件名
try{
Filefile=newFile(savePath+"/"+uname);//創建新文件
if(file!=null&&!file.exists()){
file.createNewFile();
}
OutputStreamoputstream=newFileOutputStream(file);
URLurl=newURL(fileUrl);
HttpURLConnectionuc=(HttpURLConnection)url.openConnection();
uc.setDoInput(true);//設置是否要從URL連接讀取數據,默認為true
uc.connect();
InputStreamiputstream=uc.getInputStream();
System.out.println("filesizeis:"+uc.getContentLength());//列印文件長度
byte[]buffer=newbyte[4*1024];
intbyteRead=-1;
while((byteRead=(iputstream.read(buffer)))!=-1){
oputstream.write(buffer,0,byteRead);
}
oputstream.flush();
iputstream.close();
oputstream.close();
}catch(Exceptione){
System.out.println("讀取失敗!");
e.printStackTrace();
}
System.out.println("生成文件路徑:"+downPath+fileName);
}
⑷ 怎樣跨域獲取值,我有一個介面,通過url方式訪問可以返回一個字元串類型的值
給出的串格式類似與定義「對象直接量」,因此用eval()函數訪問你要的值域比較方便:
var str = '{"count":"1","num400":400}';
var obj = eval('('+str+')');
alert(obj.num400);//400
eval轉換為匿名對象
⑸ 求使用httpClient項目實現向指定網路URL傳參並獲得返回值的代碼
packagecom.weixin.util;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.StringWriter;
importjava.io.UnsupportedEncodingException;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Map;
importorg.apache.http.Header;
importorg.apache.http.HttpHost;
importorg.apache.http.HttpResponse;
importorg.apache.http.HttpStatus;
importorg.apache.http.HttpVersion;
importorg.apache.http.ParseException;
importorg.apache.http.client.ClientProtocolException;
importorg.apache.http.client.HttpClient;
importorg.apache.http.client.entity.UrlEncodedFormEntity;
importorg.apache.http.client.methods.HttpGet;
importorg.apache.http.client.methods.HttpPost;
importorg.apache.http.client.params.CookiePolicy;
importorg.apache.http.client.params.HttpClientParams;
importorg.apache.http.conn.params.ConnRoutePNames;
importorg.apache.http.impl.client.DefaultHttpClient;
importorg.apache.http.message.BasicNameValuePair;
importorg.apache.http.params.BasicHttpParams;
importorg.apache.http.params.HttpConnectionParams;
importorg.apache.http.params.HttpParams;
importorg.apache.http.params.HttpProtocolParams;
importorg.apache.http.protocol.HTTP;
//importbsh.ParseException;
importcom.google.gson.Gson;
/**
*TODO
*@Version1.0
*/
publicclassHttpClients{
/**UTF-8*/
privatestaticfinalStringUTF_8="UTF-8";
/**日誌記錄tag*/
privatestaticfinalStringTAG="HttpClients";
/**用戶host*/
privatestaticStringproxyHost="";
/**用戶埠*/
privatestaticintproxyPort=80;
/**是否使用用戶埠*/
privatestaticbooleanuseProxy=false;
/**連接超時*/
privatestaticfinalintTIMEOUT_CONNECTION=60000;
/**讀取超時*/
privatestaticfinalintTIMEOUT_SOCKET=60000;
/**重試3次*/
privatestaticfinalintRETRY_TIME=3;
/**
*@paramurl
*@paramrequestData
*@return
*/
publicStringdoHtmlPost(HttpClienthttpClient,HttpPosthttpPost)
{
StringresponseBody=null;
intstatusCode=-1;
try{
HttpResponsehttpResponse=httpClient.execute(httpPost);
HeaderlastHeader=httpResponse.getLastHeader("Set-Cookie");
if(null!=lastHeader)
{
httpPost.setHeader("cookie",lastHeader.getValue());
}
statusCode=httpResponse.getStatusLine().getStatusCode();
if(statusCode!=HttpStatus.SC_OK){
System.out.println("HTTP"+""+"HttpMethodfailed:"+httpResponse.getStatusLine());
}
InputStreamis=httpResponse.getEntity().getContent();
responseBody=getStreamAsString(is,HTTP.UTF_8);
}catch(Exceptione){
//發生網路異常
e.printStackTrace();
}finally{
// httpClient.getConnectionManager().shutdown();
// httpClient=null;
}
returnresponseBody;
}
/**
*
*發起網路請求
*
*@paramurl
*URL
*@paramrequestData
*requestData
*@returnINPUTSTREAM
*@throwsAppException
*/
publicstaticStringdoPost(Stringurl,StringrequestData)throwsException{
StringresponseBody=null;
HttpPosthttpPost=null;
HttpClienthttpClient=null;
intstatusCode=-1;
inttime=0;
do{
try{
httpPost=newHttpPost(url);
httpClient=getHttpClient();
//設置HTTPPOST請求參數必須用NameValuePair對象
List<BasicNameValuePair>params=newArrayList<BasicNameValuePair>();
params.add(newBasicNameValuePair("param",requestData));
UrlEncodedFormEntityentity=newUrlEncodedFormEntity(params,HTTP.UTF_8);
//設置HTTPPOST請求參數
httpPost.setEntity(entity);
HttpResponsehttpResponse=httpClient.execute(httpPost);
statusCode=httpResponse.getStatusLine().getStatusCode();
if(statusCode!=HttpStatus.SC_OK){
System.out.println("HTTP"+""+"HttpMethodfailed:"+httpResponse.getStatusLine());
}
InputStreamis=httpResponse.getEntity().getContent();
responseBody=getStreamAsString(is,HTTP.UTF_8);
break;
}catch(UnsupportedEncodingExceptione){
time++;
if(time<RETRY_TIME){
try{
Thread.sleep(1000);
}catch(InterruptedExceptione1){
}
continue;
}
//發生致命的異常,可能是協議不對或者返回的內容有問題
e.printStackTrace();
}catch(ClientProtocolExceptione){
time++;
if(time<RETRY_TIME){
try{
Thread.sleep(1000);
}catch(InterruptedExceptione1){
}
continue;
}
//發生致命的異常,可能是協議不對或者返回的內容有問題
e.printStackTrace();
}catch(IOExceptione){
time++;
if(time<RETRY_TIME){
try{
Thread.sleep(1000);
}catch(InterruptedExceptione1){
}
continue;
}
//發生網路異常
e.printStackTrace();
}catch(Exceptione){
time++;
if(time<RETRY_TIME){
try{
Thread.sleep(1000);
}catch(InterruptedExceptione1){
}
continue;
}
//發生網路異常
e.printStackTrace();
}finally{
httpClient.getConnectionManager().shutdown();
httpClient=null;
}
}while(time<RETRY_TIME);
returnresponseBody;
}
/**
*
*將InputStream轉化為String
*
*@paramstream
*inputstream
*@paramcharset
*字元集
*@return
*@throwsIOException
*/
(InputStreamstream,Stringcharset)throwsIOException{
try{
BufferedReaderreader=newBufferedReader(newInputStreamReader(stream,charset),8192);
StringWriterwriter=newStringWriter();
char[]chars=newchar[8192];
intcount=0;
while((count=reader.read(chars))>0){
writer.write(chars,0,count);
}
returnwriter.toString();
}finally{
if(stream!=null){
stream.close();
}
}
}
/**
*得到httpClient
*
*@return
*/
(){
finalHttpParamshttpParams=newBasicHttpParams();
if(useProxy){
HttpHostproxy=newHttpHost(proxyHost,proxyPort,"http");
httpParams.setParameter(ConnRoutePNames.DEFAULT_PROXY,proxy);
}
HttpConnectionParams.setConnectionTimeout(httpParams,TIMEOUT_CONNECTION);
HttpConnectionParams.setSoTimeout(httpParams,TIMEOUT_SOCKET);
HttpClientParams.setRedirecting(httpParams,true);
finalStringuserAgent="Mozilla/5.0(Windows;U;WindowsNT6.1;zh-CN;rv:1.9.2.14)Gecko/20110218Firefox/3.6.14";
HttpProtocolParams.setUserAgent(httpParams,userAgent);
HttpProtocolParams.setVersion(httpParams,HttpVersion.HTTP_1_1);
HttpClientParams.setCookiePolicy(httpParams,CookiePolicy.RFC_2109);
HttpProtocolParams.setUseExpectContinue(httpParams,false);
HttpClientclient=newDefaultHttpClient(httpParams);
returnclient;
}
/**
*
*得到httpClient
*
*@return
*/
(){
finalHttpParamshttpParams=newBasicHttpParams();
if(useProxy){
HttpHostproxy=newHttpHost(proxyHost,proxyPort,"http");
httpParams.setParameter(ConnRoutePNames.DEFAULT_PROXY,proxy);
}
HttpConnectionParams.setConnectionTimeout(httpParams,TIMEOUT_CONNECTION);
HttpConnectionParams.setSoTimeout(httpParams,TIMEOUT_SOCKET);
HttpClientParams.setRedirecting(httpParams,true);
finalStringuserAgent="Mozilla/5.0(Windows;U;WindowsNT6.1;zh-CN;rv:1.9.2.14)Gecko/20110218Firefox/3.6.14";
HttpProtocolParams.setUserAgent(httpParams,userAgent);
HttpProtocolParams.setVersion(httpParams,HttpVersion.HTTP_1_1);
HttpClientParams.setCookiePolicy(httpParams,CookiePolicy.BROWSER_COMPATIBILITY);
HttpProtocolParams.setUseExpectContinue(httpParams,false);
HttpClientclient=newDefaultHttpClient(httpParams);
returnclient;
}
/**
*列印返回內容
*@paramresponse
*@throwsParseException
*@throwsIOException
*/
publicstaticvoidshowResponse(Stringstr)throwsException{
Gsongson=newGson();
Map<String,Object>map=(Map<String,Object>)gson.fromJson(str,Object.class);
Stringvalue=(String)map.get("data");
//StringdecodeValue=Des3Request.decode(value);
//System.out.println(decodeValue);
//logger.debug(decodeValue);
}
/**
*
*發起網路請求
*
*@paramurl
*URL
*@paramrequestData
*requestData
*@returnINPUTSTREAM
*@throwsAppException
*/
publicstaticStringdoGet(Stringurl)throwsException{
StringresponseBody=null;
HttpGethttpGet=null;
HttpClienthttpClient=null;
intstatusCode=-1;
inttime=0;
do{
try{
httpGet=newHttpGet(url);
httpClient=getHttpClient();
HttpResponsehttpResponse=httpClient.execute(httpGet);
statusCode=httpResponse.getStatusLine().getStatusCode();
if(statusCode!=HttpStatus.SC_OK){
System.out.println("HTTP"+""+"HttpMethodfailed:"+httpResponse.getStatusLine());
}
InputStreamis=httpResponse.getEntity().getContent();
responseBody=getStreamAsString(is,HTTP.UTF_8);
break;
}catch(UnsupportedEncodingExceptione){
time++;
if(time<RETRY_TIME){
try{
Thread.sleep(1000);
}catch(InterruptedExceptione1){
}
continue;
}
//發生致命的異常,可能是協議不對或者返回的內容有問題
e.printStackTrace();
}catch(ClientProtocolExceptione){
time++;
if(time<RETRY_TIME){
try{
Thread.sleep(1000);
}catch(InterruptedExceptione1){
}
continue;
}
//發生致命的異常,可能是協議不對或者返回的內容有問題
e.printStackTrace();
}catch(IOExceptione){
time++;
if(time<RETRY_TIME){
try{
Thread.sleep(1000);
}catch(InterruptedExceptione1){
}
continue;
}
//發生網路異常
e.printStackTrace();
}catch(Exceptione){
time++;
if(time<RETRY_TIME){
try{
Thread.sleep(1000);
}catch(InterruptedExceptione1){
}
continue;
}
//發生網路異常
e.printStackTrace();
}finally{
httpClient.getConnectionManager().shutdown();
httpClient=null;
}
}while(time<RETRY_TIME);
returnresponseBody;
}
}
⑹ C++如何實現打開url連接,並返回一個流對象
void CBaiUseMfcMBDlg::OnBnClickedButton1()
{
//判斷是否可連接INTER網
if(InternetAttemptConnect(0) != ERROR_SUCCESS)
{
AfxMessageBox("無法連接INTERNET!");
return;
}
//創建internet連接
HINTERNET hInet = InternetOpen(
_T("downloader"),
INTERNET_OPEN_TYPE_DIRECT,
NULL,
NULL,
NULL);
if(hInet == NULL)
{
AfxMessageBox("InternetOpen()失敗!");
return;
}
//創建http請求頭
TCHAR header[1024];
memset(header,0x0,sizeof(header));
int filelen = 8192;
_stprintf(header, _T("Range:bytes=%d-"), filelen);
//打開URL地址頁面
HINTERNET hIurl = InternetOpenUrl(
hInet,
_T(""),
header,
-1,
0,
0);
if(hIurl == NULL)
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
0, // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Process any inserts in lpMsgBuf.
// ...
// Display the string.
::MessageBox( NULL, (LPCTSTR)lpMsgBuf, NULL, MB_OK | MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
InternetCloseHandle(hInet);
return;
}
//讀取打開的頁面內容
TCHAR buf[8192];
memset(buf,0x0,sizeof(buf));
DWORD dwR = 0;
if ( ! InternetReadFile(hIurl,buf,8192,&dwR) )
{
InternetCloseHandle(hInet);
InternetCloseHandle(hIurl);
AfxMessageBox("InternetReadFile()失敗!");
return;
}
//輸出
AfxMessageBox(buf);
//關閉打開的句柄
InternetCloseHandle(hInet);
InternetCloseHandle(hIurl);
}
⑺ 如何抓取訪問特定URL的HTTP流的數據包
wireshark 抓包是對整個網卡而言的,無法對相應的應用程序進行抓包,但你可以通過分析你的程序進行過濾,比如我要抓瀏覽器的包,在抓好的包里進行 HTTP 過濾就可以看到類似的,再根據自己的請求判斷自己抓的哪個包,當然也可以用360,qq的大師什麼的,監控這個程序所使用的TCP流,找到再 wireshark 包里過濾即可。
盡可能的關閉其他的應用程序,先打開wireshark工具,選定當前的網卡開始,點擊開始抓包,然後在打開瀏覽器,輸入地址,進行訪問操作,wireshark會自動將來往數據抓下來,過後你保存分析就行了。
下面的圖是我訪問網路時的一些數據包,包含tcp會話建立的時候的情況,但是在包裡面沒有抓取的FIN的數據包。網頁挺難抓到的,貌似有個hold time。tcp會話不會立刻中斷。
⑻ 如何用別人的電腦通過網路訪問到自己的電腦上的文件 url 應該怎樣寫
遠程桌面或者共享!
運行——輸入「mstsc /v: IP地址 /console 」
或者 運行\\IP地址\C&
⑼ jquery訪問對象,通過什麼方法或什麼方法轉換成節點對象
你是問Query對象如何轉為dom對象吧?若是的話,答案如下:
jQuery獲取的對象(通過$(...))是jQuery對象,要想轉為dom對象,有如下幾種方式:
如:var oDiv = $('#myDiv');
oDiv[0]
oDIv.get(0)
使用each函數也能間接實現jQuery對象到dom對象的轉換,如:
oDiv.each(function(){
console.log(this instanceof jQuery); // 控制台列印輸出false,即:此處的this已經不是jQuery對象了
});
⑽ 通過URL和HTTP請求獲取網路資源兩者有什麼區別
http是通訊方式 他要用url