如何实现android和服务器长连接

 我来答
一骑当后
推荐于2016-01-18 · 知道合伙人数码行家
一骑当后
知道合伙人数码行家
采纳数:40298 获赞数:306432
网络、设备维护、电路、弱电检测。

向TA提问 私信TA
展开全部
  前言:现在的大多数移动端应用都有实时得到消息的能力,简单来说,有发送消息的主动权和接受消息的被动权。例如:微信,QQ,天气预报等等,相信好处和用户体验相信大家都知道吧。

  提出问题:这种功能必须涉及client(客户端)和server(服务器),所以到底client如何和server实现实时连接通讯?

  分析问题:这种功能实际上就是数据同步,同时要考虑手机本身、电量、网络流量等等限制因素,所以通常在移动端上有一下两个解决方案:
  1.一种是定时去server查询数据,通常是使用HTTP协议来访问web服务器,称Polling(轮询);
  2.还有一种是移动端和服务器建立长连接,使用XMPP长连接,称Push(推送)。

  从耗费的电量、流量和数据延迟性各方面来说,Push有明显的优势。但是使用Push的缺点是:
  对于客户端:实现和维护相对成本高,在移动无线网络下维护长连接,相对有一些技术上的开发难度。
  对于服务器:如何实现多核并发,cpu作业调度,数量庞大的长连接并发维护等技术,仍存在开发难点。转载,仅供参考。
妮浅笑99
推荐于2016-01-06 · 还没有任何签名哦
妮浅笑99
采纳数:126 获赞数:1392

向TA提问 私信TA
展开全部
1:android客户端通过service在后台通过servreScoket不断的accept,一旦有相应的socket到达,则启动一个线程去处理
2::在线程中处理完返回给我们android客户端的消息或任务之后,要将这种结果表现在ui上,这个步骤方法就比较多了,例如你可以发一个广播来通知ui,或者你可以通过一个static的handler来处理
*************************************service中的关键代码
private void startSocketServer()
{
if (!isStarted)
{
try
{
serverSocket = new ServerSocket( 6661 );
isStarted = true;
}
catch (Exception e)
{
// TODO: handle exception
}

// 启动线程处理
AcceptThread acceptThread = new AcceptThread();
acceptThread.start();
}

}

class AcceptThread extends Thread
{
@Override
public void run()
{
while (isStarted)
{
try
{

// 阻塞接收
Socket client = serverSocket.accept();
initClientSocket( client );
}
catch (Exception e)
{
// TODO: handle exception
}

}
super.run();
}
}

private void initClientSocket(Socket client)
{

boolean isRunnable = true;
/**
* 重置
**/
if (cInputStream != null)
{
try
{
cInputStream.close();
cInputStream = null;
}
catch (IOException e)
{
e.printStackTrace();
}
}

if (clientSocket != null)
{
try
{
clientSocket.close();
clientSocket = null;
}
catch (Exception e)
{
// TODO: handle exception
}
}

String resultStr = "";
clientSocket = client;
try
{
cInputStream = new DataInputStream( clientSocket.getInputStream() );

if (isRunnable)
{
StringBuffer sb1 = new StringBuffer();
int ss;
while ((ss = cInputStream.read()) != -1)
{
sb1.append( (char) ss );
}
resultStr = sb1.toString();
//发送广播
Intent intent = new Intent();
intent.putExtra( "str", resultStr );
intent.setAction( "com.jone.receiver" );
sendBroadcast( intent );
// Message msg = ((MainActivity)getApplicationContext()).handler.obtainMessage();
// msg.obj = resultStr;
// ((MainActivity)getApplicationContext()).handler.sendMessage( msg );

}

}
catch (Exception e)
{
// TODO Auto-generated catch block
isRunnable = false;
e.printStackTrace();
}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百宜羿沛若
2019-09-16 · TA获得超过3614个赞
知道大有可为答主
回答量:3015
采纳率:27%
帮助的人:184万
展开全部
一般与服务器的连接在15分钟左右无操作就会断掉,要想实现长连接就得定时每过几分钟就向服务器端发送一个请求(这种请求只是为了与服务器保持连接,所以无需请求服务器端的数据,对程序的效率基本无影响)。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
生活he家
2014-12-16 · 一个属于大家的搬运工
生活he家
采纳数:1536 获赞数:6828

向TA提问 私信TA
展开全部
做个连接 不用的时候定时向服务器发数据
追答
做个连接  不用的时候定时向服务器发数据
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
丫丫豆包
2014-12-15 · TA获得超过163个赞
知道答主
回答量:175
采纳率:0%
帮助的人:71.6万
展开全部
用socket链接呗,也就是Tcp连接
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式