1. 程式人生 > >android中對服務端的長連線【socket】

android中對服務端的長連線【socket】

    我們有時候有這種需求,即我們的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長連線