Android实现TCP客户端接收数据的方法
本文实例讲述了android实现tcp客户端接收数据的方法。分享给大家供大家参考,具体如下:
配合log4net使用,用来接收调试信息。因此,此客户端只管通过tcp接收字符串数据,然后显示在界面上。
接收tcp数据
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(); }
开线程执行接收操作
但是,如果接收代码直接放ui按钮处理事件中,将直接引发networkonmainthreadexception,这是因为不能在主线程中执行socket操作。这里使用asynctask开另一个线程执行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()通知接收线程结束接收操作。
接收线程在doinbackground中调用iscancelled()来检查是否出现结束接收要求。
2、asynctask接收到数据之后,传递给界面显示。
接收线程使用handler将数据传递给界面
使用handler的话,数据作为“消息”传递给界面处理。
handler包括了处理消息功能和发布消息功能。在这里,处理消息就是在界面上显示log文本,界面线程来干。发布消息就是将log文本作为参数,调用postmessage功能,接收线程来干。
主线程中的处理消息
handler handler = new handler(){ @override public void handlemessage(message msg){ text.settext(text.gettext().tostring()+(string)msg.obj); } };
接收线程中的发布消息
message msg = new message(); msg.obj = msgstring; (mainactivity.this).handler.postmessage();
以上就构成了一个简单,但可用的tcp方式的log接收端。拿个360wifi或者小米wifi,就可以使用手机接收pc应用程序发出来的log了。
更多关于android相关内容感兴趣的读者可查看本站专题:《android通信方式总结》、《android调试技巧与常见问题解决方法汇总》、《android开发入门与进阶教程》、《android多媒体操作技巧汇总(音频,视频,录音等)》、《android基本组件用法总结》、《android视图view技巧总结》、《android布局layout技巧总结》及《android控件用法总结》
希望本文所述对大家android程序设计有所帮助。