Ⅰ android怎麼實現HTTP長連接
轉載 這種功能實際上就是數據同步,同時要考慮手機本身、電量、網路流量等等限制因素,所以通常在移動端上有一下兩個解決方案: 1.一種是定時去server查詢數據,通常是使用HTTP協議來訪問web伺服器,稱Polling(輪詢); 2.還有一種是移動端和伺服器建立長連接,使用XMPP長連接,稱Push(推送)。 從耗費的電量、流量和數據延遲性各方面來說,Push有明顯的優勢。但是使用Push的缺點是: 對於客戶端:實現和維護相對成本高,在移動無線網路下維護長連接,相對有一些技術上的開發難度。 對於伺服器:如何實現多核並發,cpu作業調度,數量龐大的長連接並發維護等技術,仍存在開發難點。 在講述Push方案的原理前,我們先了解一下移動無線網路的特點。 移動無線網路的特點: 因為 IP v4 的 IP 量有限,運營商分配給手機終端的 IP 是運營商內網的 IP,手機要連接 Internet,就需要通過運營商的網關做一個網路地址轉換(Network Address Translation,NAT)。簡單的說運營商的網關需要維護一個外網 IP、埠到內網 IP、埠的對應關系,以確保內網的手機可以跟 Internet 的伺服器通訊 GGSN(Gateway GPRS Support Node 網關GPRS支持結點)模塊就實現了NAT功能。 因為大部分移動無線網路運營商都是為了減少網關的NAT映射表的負荷,所以如果發現鏈路中有一段時間沒有數據通訊時,會刪除其對應表,造成鏈路中斷。(關於NAT的作用及其原理可以查看我的另一篇博文:關於使用UDP(TCP)跨區域網,NAT穿透的心得) Push在Android平台上長連接的實現: 既然我們知道我們移動端要和Internet進行通信,必須通過運營商的網關,所以,為了不讓NAT映射表失效,我們需要定時向Internet發送數據,因為只是為了不然NAT映射表失效,所以只需發送長度為0的數據即可。 這時候就要用到定時器,在android系統上,定時器通常有一下兩種: 1.java.util.Timer 2.android.app.AlarmManager 分析: Timer:可以按照計劃或者時間周期來執行相關的任務。但是Timer需要用WakeLock來讓CPU保持喚醒狀態,才能保證任務的執行,這樣子會消耗大量流量;當CPU處於休眠的時候,就不能喚醒執行任務,所以應用於移動端明顯是不合適。 AlarmManager:AlarmManager類是屬於android系統封裝好來管理RTC模塊的管理類。這里就涉及到RTC模塊,要更好地了解兩者的區別,就要明白兩者真正的區別。 RTC(Real- Time Clock)實時鬧鍾在一個嵌入式系統中,通常採用RTC 來提供可靠的系統時間,包括時分秒和年月日等;而且要求在系統處於關機狀態下它也能夠正常工作(通常採用後備電池供電),它的外圍也不需要太多的輔助電路,典型的就是只需要一個高精度的32.768KHz 晶體和電阻電容等。(如果對這方面感興趣,可以自己查閱相關資料,這里就說個大概) 好了,回來正題。所以,AlarmManager又稱全局定時鬧鍾。這意味著,當我用使用AlarmManager來定時執行任務,CPU可以正常地休眠,只有在執行任務是,才喚醒CPU,這個過程是很短時間的。 下面簡單來說明其使用: 1.類似於Timer功能: //獲得鬧鍾管理器 AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); //設置任務執行計劃 am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, 5*1000, sender);//從firstTime才開始執行,每隔5秒再執行 2.實現全局定時功能: //獲得鬧鍾管理器 AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); //設置任務執行計劃 am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 5*1000, sender);//從firstTime才開始執行,每隔5秒再執行 總結:在android客戶端使用Push推送時,應該使用AlarmManager來實現心跳功能,使其真正實現長連接。
Ⅱ android開發 如何判斷http伺服器端是否打開
你的想法是做不到的。都是用超時表示失敗,服務狀態也是,只有放到線程里去,讓它慢慢地去判斷。
Ⅲ android怎麼理解http協議
超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最為廣泛的一種網路協議。所有的WWW文件都必須遵守這個標准。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。
HTTP是一個客戶端和伺服器端請求和應答的標准(TCP)。客戶端是終端用戶,伺服器端是網站。通過使用Web瀏覽器、網路爬蟲或者其它的工具,客戶端發起一個到伺服器上指定埠(默認埠為80)的HTTP請求。(我們稱這個客戶端)叫用戶代理(user agent)。應答的伺服器上存儲著(一些)資源,比如HTML文件和圖像。(我們稱)這個應答伺服器為源伺服器(origin server)。在用戶代理和源伺服器中間可能存在 http和其他幾種網路協議[1]多個中間層,比如代理,網關,或者隧道(tunnels)。盡管TCP/IP協議是互聯網上最流行的應用,HTTP協議並沒有規定必須使用它和(基於)它支持的層。 事實上,HTTP可以在任何其他互聯網協議上,或者在其他網路上實現。HTTP只假定(其下層協議提供)可靠的傳輸,任何能夠提供這種保證的協議都可以被其使用。通常,由HTTP客戶端發起一個請求,建立一個到伺服器指定埠(默認是80埠)的TCP連接。HTTP伺服器則在那個埠監聽客戶端發送過來的請求。一旦收到請求,伺服器(向客戶端)發回一個狀態行,比如"HTTP/1.1 200 OK",和(響應的)消息,消息的消息體可能是請求的文件、錯誤消息、或者其它一些信息。 HTTP協議的網頁HTTP使用TCP而不是UDP的原因在於(打開一個)一個網頁必須傳送很多數據,而TCP協議提供傳輸控制,按順序組織數據,和錯誤糾正。通過HTTP或者HTTPS協議請求的資源由統一資源標示符(Uniform Resource Identifiers)(或者,更准確一些,URLs)來標識。
Ⅳ Android Http連接和TCP連接的區別
Http是應用層協議,TCP是網路層協議,應用層在TCP/IP四層架構中位於TCP的上一層。
建立Http連接在實現時有以下兩種方式:
1、[java] view plain
DefaultHttpClient http = new DefaultHttpClient();
HttpGet method = new HttpGet(url);
HttpResponse response =http.execute(method);
2、[java] view plain
URL url = new URL(uri);
HttpURLConnection connection = (HttpURLConnection)
url.openConnection();
connection.connect();
而TCP連接在實現時要藉助Socket(套接字 IP+埠號)
[java] view plain
Socket s = new Socket("localhost", 12345);
區別從這兩個連接的實現方式就可以看出來,HTTP連接需要指明資源的URL,發出請求的應用不知道伺服器的IP,雖然域名伺服器也是要把域名解析成IP地址,但不屬於應用所關心的范疇,是網路層應該完成的工作。所以Http連接屬於無狀態的短連接,若再請求其他數據,需要再重新建立連接。客戶端向伺服器發送請求後,伺服器才知道客戶端的存在。
TCP連接實現時需要指明IP地址和埠號,就可以跟目的主機通過三次握手建立聯系,該連接一直保持直到某一方提出取消連接,通過四次握手關閉連接。Socket支持TCP/UDP協議,如果使用TCP協議,那麼socket連接就是TCP連接。論文提到的應用場景是手機與雲端的伺服器建立聯系,因為要保持連接並指定連接的建立時間,所以在這種場景下使用TCP連接最合適。3G網路不支持端到端建立TCP連接,因為它是client-server模式,所以需要通過雲端伺服器的輔助來實現手機的端到端通信。
Ⅳ 如何在 android 本地搭建一個 http 伺服器
這一陣感覺玩手機玩膩了,VPS也玩膩了,瞬間感覺啥都玩膩了。前幾天閑著無聊,看到了手機上的超級終端,心想:安卓底層不也是Linux么?於是就用超級終端wget了一個文件,成功了!吼吼,於是下一個想法就是能不能在手機上搭建一個WEB環境??? 想到就開始各種搜,發現安卓使用的Linux並不屬於任何發行版本,看來使用傳統的建站方式不行了。繼續搜索,發現谷歌商店裡有一個集成lighttpd+php+mysql+phpmyadmin環境的APK,哈哈,這下好了。當然,如果只裝上這個APK只能在本地測試,無法使用公網訪問,所以,經過我各種搜,終於有了這一篇文章,毫不客氣的說,這絕對是全網首發,至少不用讓你再像我一樣各種搜了。 現在的手機硬體已經很強大了,¥1999就能買到4核1.5G,2G內存的手機,這幾乎能滿足像我這樣的小站的需求了。硬體有了,集成環境的APK也有了,就剩下公網訪問了。 第一:需要一部安卓手機,至少600MHZ的CPU,256內存,手機需要ROOT,沒有ROOT的話,不能使用80埠。 第二:下載我提供的集成環境的APK文件(這里)解壓密碼:,KSWEB在谷歌商店裡是收費的,免費試用5天,我提供的這個文件為網友破解版,免費試用55年,夠你折騰了。 第三:需要一個支持路由功能的路由器,以及一個花生殼賬號。 1.首先在手機上安裝APK,(如果手機里有什麼防火牆之類的,請關閉,否則不能使用WIFI地址訪問),然後點開KSWEB,首次開啟,會解壓縮文件,然後會提示重啟,重啟後,就能夠看到mysql啟動和相應信息了。 2.點options進入設置,然後勾選上root許可權,這樣就可以更改埠為80了。然後回到主界面,點phpmyadmin然後就會自動下載了。下載成功後,可以在手機瀏覽器里輸入127.0.0.1,就可以看到相關信息。雖然版本有些老,但是相當簡便啊親…… 如果你只想在手機上測試,那麼到這里就結束了。如果想讓公網訪問手機, 那麼就需要使用DDNS(動態域名解析)來支持。 3.使用oray護照,登錄花生殼,系統會自動分配給你一個免費域名,用這個域名來訪問手機。登錄你的路由器,點擊“轉發規則”,選擇“虛擬伺服器”,埠填寫80,IP地址填寫你手機WIFI的IP地址,保存,如圖所示。 4.保存後,點擊“動態DNS設置”,賬號密碼就是你oray的通行證,點登錄,如果成功了,就會自動識別你的免費域名。如圖所示,然後保存就行了。 這樣的話,直接輸入域名就可以訪問到手機了,只要你的路由器不關閉,就可以一直使用了。下面是我的演示: 至此,你的手機就可以當成一個獨立的VPS來使用了,建議使用閑置的手機來玩,它有以下幾個好處:裝13,夠折騰,省電省資源,廢物利用,數據更安全,便攜,國內速度一流……還有,查域名的時候貌似是獨立IP,這樣網路會不會喜歡呢?
Ⅵ 框架android-async-http 伺服器怎麼接受文件
在服務端,比如servlet,從requset里拿到inputStream,從流裡面讀取,然後生成文件
Ⅶ android使用http怎麼向伺服器獲得數據並用json解析
寫個適配器
下面是代碼:
importjava.io.InputStream;
importjava.net.MalformedURLException;
importjava.net.URL;
importjava.util.ArrayList;
importjava.util.List;
importjavax.net.ssl.HttpsURLConnection;
importorg.json.JSONArray;
importorg.json.JSONException;
importorg.json.JSONObject;
importbean.CoureBean;
importtools.StreamHelper;
importandroid.annotation.SuppressLint;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.support.annotation.VisibleForTesting;
importandroid.view.LayoutInflater;
importandroid.view.Menu;
importandroid.view.MenuItem;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.Adapter;
importandroid.widget.ArrayAdapter;
importandroid.widget.CheckBox;
importandroid.widget.ImageView;
importandroid.widget.ListAdapter;
importandroid.widget.ListView;
importandroid.widget.Switch;
importandroid.widget.TextView;
importandroid.widget.Toast;
{
privateList<CoureBean>list=newArrayList<CoureBean>();
privateListViewlv;
privateHandlerhandler=newHandler(){
publicvoidhandleMessage(android.os.Messagemsg){
switch(msg.what){
case1:
StringjsonString=msg.obj.toString();
converData(jsonString);
init();
break;
default:
break;
}
};
};
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv=(ListView)findViewById(R.id.lvImgList);
getJson();
}
//綁定列表
privatevoidconverData(StringjsonString){
try{
JSONObjectjOb=newJSONObject(jsonString);
JSONArrayjArray=jOb.getJSONArray("Data");
for(inti=0;i<jArray.length();i++){
JSONObjectcurrentItem=jArray.getJSONObject(i);
CoureBeanmodelBean=newCoureBean();
modelBean.setName(currentItem.getString("name"));
modelBean.setImgUrl(currentItem.getString("picSmall"));
list.add(modelBean);
}
}catch(JSONExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
//獲取json數據
privatevoidgetJson(){
newThread(){
@Override
publicvoidrun(){
StringstrUrlString="http://www.imooc.com/api/teacher?type=4&num=30";
try{
URLurl=newURL(strUrlString);
HttpsURLConnectionconn=(HttpsURLConnection)url
.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
intcode=conn.getResponseCode();
if(code==200){
InputStreamis=conn.getInputStream();
StringjsonString=StreamHelper.readInputStream(is);
Messagemsg=newMessage();
msg.what=1;
msg.obj=jsonString;
handler.sendMessage(msg);
}
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}.start();
}
classViewHolder{
ImageViewimPic;
TextViewtxtName;
}
privatevoidinit(){
ArrayAdapteradapter=newMyAdapter(this,R.layout.list_item,list);
lv.setAdapter(adapter);
}
/**
*自定義適配器(內部類)
*
*@author
*
*/
<CoureBean>{
privateintresourceId;
//構造函數
publicMyAdapter(Contextcontext,intresource,List<CoureBean>objects){
super(context,resource,objects);
resourceId=resource;
}
@SuppressLint("ViewHolder")
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
Viewview;
ViewHolderviewHolder=newViewHolder();
if(convertView==null){
view=LayoutInflater.from(MainActivity.this).inflate(
resourceId,null);//拿到當前行對象
//拿到當前視圖對象裡面的名字叫tvPwdTitle的TextView對象
viewHolder.txtName=(TextView)view.findViewById(R.id.txtName);
viewHolder.imPic=(ImageView)view
.findViewById(R.id.imageView1);
view.setTag(viewHolder);
}else{
view=convertView;
}
//拿到應該放在當前行上的數據
finalCoureBeandataItem=getItem(position);
viewHolder=(ViewHolder)view.getTag();
viewHolder.txtName.setText(dataItem.getName());
returnview;
}
}
}
Ⅷ 在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的貌似也挺正常的。暫時沒遇到不能用的。