❶ 請問android 發送大量的http請求怎麼做最好呢
你應該寫清楚應用場景,懶得寫代碼,只寫思路
分兩種使用場景吧,第一種,就是無腦post,對伺服器造成很大負擔(如果這就是你的目的),那你只需要寫個timer循環,每隔一秒或者幾秒post服務端就行了
第二種,在get到結果後循環post,這個方式比較合理,不需要timer循環,對伺服器負荷也小,需要一個hanlderMessage,在get到結果或異常後給hanlderMessage發送消息,handlerMessage再執行一次post即可
❷ 在Android中使用NanoHTTPD,一個輕量級的HTTP SERVER,2.2和2.3的系統運行正常,為什麼3.0和4.0無法使用
SDK8以上的據說127.0.0.1這個樣的IP請求本地不會響應了,異常拋在native層。比如谷歌新出的那個PAD搭載4.2的ROM據說就不能在響應了,stackoverflow上有人遇到過。但是我確實沒遇到。4.0以下的手機上運行正常。4.1的貌似也挺正常的。暫時沒遇到不能用的。
❸ 怎麼用http協議實現安卓數據
網上介紹Android上http通信的文章很多,不過大部分只給出了實現代碼的片段,一些注意事項和如何設計一個合理的類用來處理所有的http請求以及返回結果,一般都不會提及。因此,自己對此做了些總結,給出了我的一個解決方案。
首先,需要明確一下http通信流程,Android目前提供兩種http通信方式,HttpURLConnection和HttpClient,HttpURLConnection多用於發送或接收流式數據,因此比較適合上傳/下載文件,HttpClient相對來講更大更全能,但是速度相對也要慢一點。在此只介紹HttpClient的通信流程:
1.創建HttpClient對象,改對象可以用來多次發送不同的http請求
2.創建HttpPost或HttpGet對象,設置參數,每發送一次http請求,都需要這樣一個對象
3.利用HttpClient的execute方法發送請求並等待結果,該方法會一直阻塞當前線程,直到返回結果或拋出異常。
4.針對結果和異常做相應處理
根據上述流程,發現在設計類的時候,有幾點需要考慮到:
1.HttpClient對象可以重復使用,因此可以作為類的靜態變數
2.HttpPost/HttpGet對象一般無法重復使用(如果你每次請求的參數都差不多,也可以重復使用),因此可以創建一個方法用來初始化,同時設置一些需要上傳到伺服器的資源
3.目前Android不再支持在UI線程中發起Http請求,實際上也不該這么做,因為這樣會阻塞UI線程。因此還需要一個子線程,用來發起Http請求,即執行execute方法
4.不同的請求對應不同的返回結果,對於如何處理返回結果(一般來說都是解析json&更新UI),需要有一定的自由度。
5.最簡單的方法是,每次需要發送http請求時,開一個子線程用於發送請求,子線程中接收到結果或拋出異常時,根據情況給UI線程發送
message,最後在UI線程的handler的handleMessage方法中做結果解析和UI更新。這么寫雖然簡單,但是UI線程和Http請求
的耦合度很高,而且代碼比較散亂、醜陋。
基於上述幾點原因,我設計了一個PostRequest類,用於滿足我的http通信需求。我只用到了Post請求,如果你需要Get請求,也可以改寫成GetRequest
package com.handspeaker.network;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.os.Handler;
import android.util.Log;
/**
*
* 用於封裝&簡化http通信
*
*/
public class PostRequest implements Runnable {
private static final int NO_SERVER_ERROR=1000;
//伺服器地址
public static final String URL = "fill your own url";
//一些請求類型
public final static String ADD = "/add";
public final static String UPDATE = "/update";
public final static String PING = "/ping";
//一些參數
private static int connectionTimeout = 60000;
private static int socketTimeout = 60000;
//類靜態變數
private static HttpClient httpClient=new DefaultHttpClient();
private static ExecutorService executorService=Executors.newCachedThreadPool();
private static Handler handler = new Handler();
//變數
private String strResult;
private HttpPost httpPost;
private HttpResponse httpResponse;
private OnReceiveDataListener onReceiveDataListener;
private int statusCode;
/**
* 構造函數,初始化一些可以重復使用的變數
*/
public PostRequest() {
strResult = null;
httpResponse = null;
httpPost = new HttpPost();
}
/**
* 注冊接收數據監聽器
* @param listener
*/
public void setOnReceiveDataListener(OnReceiveDataListener listener) {
onReceiveDataListener = listener;
}
/**
* 根據不同的請求類型來初始化httppost
*
* @param requestType
* 請求類型
* @param nameValuePairs
* 需要傳遞的參數
*/
public void iniRequest(String requestType, JSONObject jsonObject) {
httpPost.addHeader("Content-Type", "text/json");
httpPost.addHeader("charset", "UTF-8");
httpPost.addHeader("Cache-Control", "no-cache");
HttpParams httpParameters = httpPost.getParams();
HttpConnectionParams.setConnectionTimeout(httpParameters,
connectionTimeout);
HttpConnectionParams.setSoTimeout(httpParameters, socketTimeout);
httpPost.setParams(httpParameters);
try {
httpPost.setURI(new URI(URL + requestType));
httpPost.setEntity(new StringEntity(jsonObject.toString(),
HTTP.UTF_8));
} catch (URISyntaxException e1) {
e1.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
/**
* 新開一個線程發送http請求
*/
public void execute() {
executorService.execute(this);
}
/**
* 檢測網路狀況
*
* @return true is available else false
*/
public static boolean checkNetState(Activity activity) {
ConnectivityManager connManager = (ConnectivityManager) activity
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connManager.getActiveNetworkInfo() != null) {
return connManager.getActiveNetworkInfo().isAvailable();
}
return false;
}
/**
* 發送http請求的具體執行代碼
*/
@Override
public void run() {
httpResponse = null;
try {
httpResponse = httpClient.execute(httpPost);
strResult = EntityUtils.toString(httpResponse.getEntity());
} catch (ClientProtocolException e1) {
strResult = null;
e1.printStackTrace();
} catch (IOException e1) {
strResult = null;
e1.printStackTrace();
} finally {
if (httpResponse != null) {
statusCode = httpResponse.getStatusLine().getStatusCode();
}
else
{
statusCode=NO_SERVER_ERROR;
}
if(onReceiveDataListener!=null)
{
//將注冊的監聽器的onReceiveData方法加入到消息隊列中去執行
handler.post(new Runnable() {
@Override
public void run() {
onReceiveDataListener.onReceiveData(strResult, statusCode);
}
});
}
}
}
/**
* 用於接收並處理http請求結果的監聽器
*
*/
public interface OnReceiveDataListener {
/**
* the callback function for receiving the result data
* from post request, and further processing will be done here
* @param strResult the result in string style.
* @param StatusCode the status of the post
*/
public abstract void onReceiveData(String strResult,int StatusCode);
}
}
代碼使用了觀察者模式,任何需要接收http請求結果的類,都要實現OnReceiveDataListener介面的抽象方法,同時PostRequest實例調用setOnReceiveDataListener方法,注冊該監聽器。完整調用步驟如下:
1.創建PostRequest對象,實現onReceiveData介面,編寫自己的onReceiveData方法
2.注冊監聽器
3.調用PostRequest的iniRequest方法,初始化本次request
4.調用PostRequest的execute方法
可能的改進:
1.如果需要多個觀察者,可以把只能注冊單個監聽器改為可以注冊多個監聽器,維護一個監聽器List。
2.如果需求比較簡單,並希望調用流程更簡潔,iniRequest和execute可以合並
❹ android sdk 安裝的時候 settings 裡面有HTTP Proxy Server HTTP Proxy Port 應該填什麼
那個不用管,直接關閉就行
❺ android https和http有什麼區別
HTTPS(Secure Hypertext Transfer Protocol)安全超文本傳輸協議
它是一個安全通信通道,它基於HTTP開發,用於在客戶計算機和伺服器之間交換信息。它使用安全套接字層(SSL)進行信息交換,簡單來說它是HTTP的安全版。
它是由Netscape開發並內置於其瀏覽器中,用於對數據進行壓縮和解壓操作,並返回網路上傳送回的結果。HTTPS實際上應用了Netscape的安全全套接字層(SSL)作為HTTP應用層的子層。(HTTPS使用埠443,而不是象HTTP那樣使用埠80來和TCP/IP進行通信。)SSL使用40 位關鍵字作為RC4流加密演算法,這對於商業信息的加密是合適的。HTTPS和SSL支持使用X.509數字認證,如果需要的話用戶可以確認發送者是誰。
HTTPS和HTTP的區別:
https協議需要到ca申請證書,一般免費證書很少,需要交費。
http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議
http和https使用的是完全不同的連接方式用的埠也不一樣,前者是80,後者是443。
http的連接很簡單,是無狀態的
HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議 要比http協議安全
HTTPS解決的問題:
1 . 信任主機的問題. 採用https 的server 必須從CA 申請一個用於證明伺服器用途類型的證書. 改證書只有用於對應的server 的時候,客戶度才信任次主機. 所以目前所有的銀行系統網站,關鍵部分應用都是https 的. 客戶通過信任該證書,從而信任了該主機. 其實這樣做效率很低,但是銀行更側重安全. 這一點對我們沒有任何意義,我們的server ,採用的證書不管自己issue 還是從公眾的地方issue, 客戶端都是自己人,所以我們也就肯定信任該server.
2 . 通訊過程中的數據的泄密和被竄改
1. 一般意義上的https, 就是 server 有一個證書.
a) 主要目的是保證server 就是他聲稱的server. 這個跟第一點一樣.
b) 服務端和客戶端之間的所有通訊,都是加密的.
i. 具體講,是客戶端產生一個對稱的密鑰,通過server 的證書來交換密鑰. 一般意義上的握手過程.
ii. 加下來所有的信息往來就都是加密的. 第三方即使截獲,也沒有任何意義.因為他沒有密鑰. 當然竄改也就沒有什麼意義了.
2. 少許對客戶端有要求的情況下,會要求客戶端也必須有一個證書.
a) 這里客戶端證書,其實就類似表示個人信息的時候,除了用戶名/密碼, 還有一個CA 認證過的身份. 應為個人證書一般來說上別人無法模擬的,所有這樣能夠更深的確認自己的身份.
b) 目前少數個人銀行的專業版是這種做法,具體證書可能是拿U盤作為一個備份的載體.
HTTPS 一定是繁瑣的.
a) 本來簡單的http協議,一個get一個response. 由於https 要還密鑰和確認加密演算法的需要.單握手就需要6/7 個往返.
i. 任何應用中,過多的round trip 肯定影響性能.
b) 接下來才是具體的http協議,每一次響應或者請求, 都要求客戶端和服務端對會話的內容做加密/解密.
i. 盡管對稱加密/解密效率比較高,可是仍然要消耗過多的CPU,為此有專門的SSL 晶元. 如果CPU 信能比較低的話,肯定會降低性能,從而不能serve 更多的請求.
ii. 加密後數據量的影響. 所以,才會出現那麼多的安全認證提示
❻ 多看的WiFi傳書是什麼原理
先檢測是否在同一區域網內,如果是,直接走區域網傳輸數據。如果不是,則通過建立wifi熱點,把自己當做熱點,讓對方連接後形成區域網,再傳輸數據。在android開發中開啟熱點需要用到反射,傳輸數據用socket。N公司在JDK6中提供的新包com.sun.net.httpserverJDK6提供了一個簡單的Http Server API,據此我們可以構建自己的嵌入式Http Server,它支持Http和Https協議,提供了HTTP1.1的部分實現,沒有被實現的那部分可以通過擴展已有的Http Server API來實現,程序員必須自己實現HttpHandler介面,HttpServer會調用HttpHandler實現類的回調方法來處理客戶端請求,在這里,我們把一個Http請求和它的響應稱為一個交換,包裝成HttpExchange類,HttpServer負責將HttpExchange傳給HttpHandler實現類的回調方法. 實現Http Server 。app端開啟httpserver服務,將接收到的文件數據保存到數據表中,調用層進行操作在手機或平板上打開多看閱讀軟體,然後點擊右上角的菜單按鈕,選擇wifi傳書。多看閱讀會彈出窗口提示「wifi服務已開啟」,並且下面有一個數字組成的地址。在電腦上的瀏覽器地址欄里輸入該地址,然後確認打開,就會看到wifi傳書的頁面。在電腦上下載格式為TXT、PDF或者EPUB的電子書籍,放在桌面上。然後拖動到wifi傳書頁面的箭頭上,或者是點擊箭頭下方的選擇文件按鈕,找到你下載的書籍,確認導入,任務就會出現在右邊的列表裡,同時顯示導入進度。具體的原理沒法說的太詳細,還是自己查一下資料比較好。
❼ 如何在android上 搭建區域網http伺服器
AndroidStudio使用Gradle構建添加依賴(推薦)
compile 'com.yanzhenjie:andserver:1.0.1'
❽ Android如何在http頭信息里設置參數
在使用http請求server時常常要傳遞一些參數給server,如IMEI號、平台號、渠道號、客戶端的版本號等一些通用信息,像這些參數我們沒有必要每次都拼在url後,我們可以統一添加到http頭里。
1.HttpClient的設置http頭的參數
HttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter(
CoreConnectionPNames.CONNECTION_TIMEOUT, CONN_TIME_OUT);
HttpGet httpget = new HttpGet(url);
httpget.addHeader("version", SystemInfo.getVersionChars());
httpget.addHeader("client_token", SystemInfo.getIMEI());
httpget.addHeader("platform", SystemInfo.getPlatForm() + "");
httpget.addHeader("channel_id", SystemInfo.getChannelId() + "");
2.HttpURLConnection的設置http頭的參數
httpURLConnection.addRequestProperty("version",
SystemInfo.getVersionChars());
httpURLConnection.addRequestProperty("client_token",
SystemInfo.getIMEI());
httpURLConnection.addRequestProperty("platform",
SystemInfo.getPlatForm() + "");
httpURLConnection.addRequestProperty("channel_id",
SystemInfo.getChannelId() + "");
❾ android中httpservletrequest、hettpservletresponse、 httpget 、httppost 四者的區別
這些都不是android特有的,java裡面一直以來都有,分下類的話,前兩個是server端的,後兩個是client端的,其中,
httpservletrequest是在server端用來取http請求發過來的數據,比如header,parameter等等。
httpservletresponse是server端用來給client端返回數據,即response。
httpget是client端用來發送http協議的get請求。
httppost是client端用來發送http協議的post請求。
具體的看javadoc,不過建議你從網路基礎知識學起。