Android實(shí)現(xiàn)TCP客戶端接收數(shù)據(jù)的方法
本文實(shí)例講述了Android實(shí)現(xiàn)TCP客戶端接收數(shù)據(jù)的方法。分享給大家供大家參考,具體如下:
配合log4net使用,用來接收調(diào)試信息。因此,此客戶端只管通過TCP接收字符串?dāng)?shù)據(jù),然后顯示在界面上。
接收TCP數(shù)據(jù)
try { Socket s = new Socket("192.168.1.5", 8240); InputStream inputStream = s.getInputStream(); DataInputStream input = new DataInputStream(inputStream); byte[] b = new byte[10000]; while(true) { int length = input.read(b); String Msg = new String(b, 0, length, "gb2312"); Log.v("data",Msg); } }catch(Exception ex) { ex.printStackTrace(); }
開線程執(zhí)行接收操作
但是,如果接收代碼直接放UI按鈕處理事件中,將直接引發(fā)NetworkOnMainThreadException,這是因?yàn)椴荒茉谥骶€程中執(zhí)行Socket操作。這里使用AsyncTask開另一個線程執(zhí)行socket操作。
// Activity按鈕事件中 GetLogTask task = new GetLogTask(); task.execute(null); // Activity類中嵌套類 public class GetLogTask extends AsyncTask<Void,Void,String> { @Override protected String doInBackground(Void...param){ try { Socket s = new Socket("192.168.1.5", 8240); InputStream inputStream = s.getInputStream(); DataInputStream input = new DataInputStream(inputStream); byte[] b = new byte[10000]; while(true) { int length = input.read(b); String Msg = new String(b, 0, length, "gb2312"); Log.v("data",Msg); } }catch(Exception ex) { ex.printStackTrace(); } return ""; } }
AsyncTask與界面線程通信
1、界面需要啟動和暫停TCP接收操作。
界面線程使用AsyncTask.cancel()通知接收線程結(jié)束接收操作。
接收線程在doInBackground中調(diào)用isCancelled()來檢查是否出現(xiàn)結(jié)束接收要求。
2、AsyncTask接收到數(shù)據(jù)之后,傳遞給界面顯示。
接收線程使用Handler將數(shù)據(jù)傳遞給界面
使用Handler的話,數(shù)據(jù)作為“消息”傳遞給界面處理。
Handler包括了處理消息功能和發(fā)布消息功能。在這里,處理消息就是在界面上顯示log文本,界面線程來干。發(fā)布消息就是將log文本作為參數(shù),調(diào)用postmessage功能,接收線程來干。
主線程中的處理消息
Handler handler = new Handler(){ @Override public void handleMessage(Message msg){ text.setText(text.getText().toString()+(String)msg.obj); } };
接收線程中的發(fā)布消息
Message msg = new Message(); msg.obj = msgstring; (MainActivity.this).handler.postMessage();
以上就構(gòu)成了一個簡單,但可用的TCP方式的log接收端。拿個360wifi或者小米wifi,就可以使用手機(jī)接收pc應(yīng)用程序發(fā)出來的log了。
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android通信方式總結(jié)》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android開發(fā)入門與進(jìn)階教程》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計(jì)有所幫助。
相關(guān)文章
Android Zipalign工具優(yōu)化Android APK應(yīng)用
本文主要介紹Android Zipalign工具優(yōu)化Android APK應(yīng)用,這里整理了相關(guān)資料及簡單優(yōu)化實(shí)例,有需要的小伙伴可以參考下2016-09-09Android 軟鍵盤自動彈出與關(guān)閉實(shí)例詳解
這篇文章主要介紹了Android 軟鍵盤自動彈出與關(guān)閉實(shí)例詳解的相關(guān)資料,為了用戶體驗(yàn)應(yīng)該自動彈出軟鍵盤而不是讓用戶主動點(diǎn)擊輸入框才彈出,這里舉例說明該如何實(shí)現(xiàn),需要的朋友可以參考下2016-12-12Android實(shí)現(xiàn)系統(tǒng)級懸浮按鈕
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)系統(tǒng)級懸浮按鈕的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03Android學(xué)習(xí)教程之高仿安卓微信6.0(2)
這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)教程之高仿安卓微信6.0的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11Android利用Sensor實(shí)現(xiàn)傳感器功能
這篇文章主要為大家詳細(xì)介紹了Android利用Sensor實(shí)現(xiàn)傳感器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11安卓(Android)中如何實(shí)現(xiàn)滑動導(dǎo)航
導(dǎo)航是移動應(yīng)用最重要的方面之一,對用戶體驗(yàn)是良好還是糟糕起著至關(guān)重要的作用。好的導(dǎo)航可以讓一款應(yīng)用更加易用并且讓用戶快速上手。相反,糟糕的應(yīng)用導(dǎo)航很容易讓人討厭,并遭到用戶的拋棄。2014-08-08Android使用Messenger實(shí)現(xiàn)service與activity交互
這篇文章主要介紹了android使用Messenger實(shí)現(xiàn)service與activity交互的相關(guān)資料,需要的朋友可以參考下2016-06-06Android實(shí)現(xiàn)用戶登錄記住密碼功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)用戶登錄記住密碼功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05Kotlin語言中CompileSdkVersion與targetSdkVersion的區(qū)別淺析
這篇文章主要介紹了Kotlin語言中CompileSdkVersion和targetSdkVersion有什么區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02