Android實(shí)現(xiàn)TCP客戶端接收數(shù)據(jù)的方法
本文實(shí)例講述了Android實(shí)現(xiàn)TCP客戶端接收數(shù)據(jù)的方法。分享給大家供大家參考,具體如下:
配合log4net使用,用來(lái)接收調(diào)試信息。因此,此客戶端只管通過(guò)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();
}
開(kāi)線程執(zhí)行接收操作
但是,如果接收代碼直接放UI按鈕處理事件中,將直接引發(fā)NetworkOnMainThreadException,這是因?yàn)椴荒茉谥骶€程中執(zhí)行Socket操作。這里使用AsyncTask開(kāi)另一個(gè)線程執(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、界面需要啟動(dòng)和暫停TCP接收操作。
界面線程使用AsyncTask.cancel()通知接收線程結(jié)束接收操作。
接收線程在doInBackground中調(diào)用isCancelled()來(lái)檢查是否出現(xiàn)結(jié)束接收要求。
2、AsyncTask接收到數(shù)據(jù)之后,傳遞給界面顯示。
接收線程使用Handler將數(shù)據(jù)傳遞給界面
使用Handler的話,數(shù)據(jù)作為“消息”傳遞給界面處理。
Handler包括了處理消息功能和發(fā)布消息功能。在這里,處理消息就是在界面上顯示log文本,界面線程來(lái)干。發(fā)布消息就是將log文本作為參數(shù),調(diào)用postmessage功能,接收線程來(lái)干。
主線程中的處理消息
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)成了一個(gè)簡(jiǎn)單,但可用的TCP方式的log接收端。拿個(gè)360wifi或者小米wifi,就可以使用手機(jī)接收pc應(yīng)用程序發(fā)出來(lái)的log了。
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android通信方式總結(jié)》、《Android調(diào)試技巧與常見(jiàn)問(wèn)題解決方法匯總》、《Android開(kāi)發(fā)入門與進(jìn)階教程》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
相關(guān)文章
RecyclerView實(shí)現(xiàn)縱向和橫向滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了RecyclerView實(shí)現(xiàn)縱向和橫向滾動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Android使用ViewPager實(shí)現(xiàn)頂部tabbar切換界面
這篇文章主要為大家詳細(xì)介紹了使用ViewPager實(shí)現(xiàn)頂部tabbar切換界面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Android利用SoundPool實(shí)現(xiàn)音樂(lè)池
這篇文章主要為大家詳細(xì)介紹了Android利用SoundPool實(shí)現(xiàn)音樂(lè)池,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Android學(xué)習(xí)教程之圓形Menu菜單制作方法(1)
這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)教程之圓形Menu菜單操作代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
Android在類微信程序中實(shí)現(xiàn)藍(lán)牙聊天功能的示例代碼
這篇文章主要介紹了Android在類微信程序中實(shí)現(xiàn)藍(lán)牙聊天功能,本文通過(guò)實(shí)例代碼給大家介紹的非常想詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
Android實(shí)現(xiàn)簡(jiǎn)單的下拉阻尼效應(yīng)示例代碼
下面小編就為大家分享一篇Android實(shí)現(xiàn)簡(jiǎn)單的下拉阻尼效應(yīng)示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Android應(yīng)用程序四大組件之使用AIDL如何實(shí)現(xiàn)跨進(jìn)程調(diào)用Service
Android應(yīng)用程序的四大組件中Activity、BroadcastReceiver、ContentProvider、Service都可以進(jìn)行跨進(jìn)程,Android系統(tǒng)采用了遠(yuǎn)程過(guò)程調(diào)用(RPC)方式來(lái)實(shí)現(xiàn)跨進(jìn)程調(diào)用服務(wù)(Service),對(duì)于Service的跨進(jìn)程調(diào)用需要通過(guò)AIDL來(lái)實(shí)現(xiàn),關(guān)于如何實(shí)現(xiàn)aidl service請(qǐng)看本文介紹2015-10-10

