我们有时候有这种需求,即我们的android客户端要始终保持与服务端的连接,当服务端有任务或消息发送到android客户端的时候就发送,没有任务或消息的时候不发送但要保持这个连接,一旦有任务则开发发送,而我们的android客户端则要保持一个时刻接收任务或消息的状态。。。这个时候我们通过socket来实现这种需求【当然你也可以采用http轮询的方式来不断的从客户端个请求服务端,这样做有一定的弊端】

实现原理:

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();
}


}
连接一个我做的小Demo Socket长连接

更多相关文章

  1. 开篇--基于Android的小巫新闻客户端开发
  2. Android BroadcastReceiver(广播)实现消息发送
  3. android的线程封装
  4. 编程之路-客户端学习知识点纲要(Web/iOS/Android/WP)
  5. Android 跨线程更新 UI
  6. android将线程绑定在指定CPU
  7. android的多线程操作(一)

随机推荐

  1. Android(安卓)基本组件介绍
  2. Android(安卓)WebView 开发详解(一)
  3. android listview嵌套gridview动态增加gr
  4. GreenDao3.0简单使用和升级
  5. android数据库——SQLiteDatabase的Helpe
  6. [android] 调试linux input子系统驱动的
  7. 编译libgdx
  8. Android学习笔记04——Activity的生命周
  9. 基于power supply信息传递的uevent机制
  10. 避免 Android(安卓)Studio 编译 APK 出现