Ⅰ 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的貌似也挺正常的。暂时没遇到不能用的。