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 TCP 客户端(仅接收数据)的更多相关文章
- 网络编程--使用TCP协议发送接收数据
package com.zhangxueliang.tcp; import java.io.IOException; import java.io.OutputStream; import java. ...
- 24-ESP8266 SDK开发基础入门篇--Android TCP客户端.控制 Wi-Fi输出PWM的占空比,调节LED亮度
https://www.cnblogs.com/yangfengwu/p/11204436.html 刚才有人说需要点鸡汤.... 我想想哈;我还没问关于哪方面的鸡汤呢!!! 我所一直走的路线 第一: ...
- 23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理
https://www.cnblogs.com/yangfengwu/p/11203546.html 先做接收消息 然后接着 public class MainActivity extends App ...
- 22-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 连接和断开
https://www.cnblogs.com/yangfengwu/p/11192618.html 有些很细致的东西参考这篇 https://www.cnblogs.com/yangfengwu ...
- socket tcp使用recv接收数据时,返回errno错误代码88
原因:就是recv函数的第一个参数不是可用的,也就是第一个参数不是建立连接时返回的文件描述符. 解决方法:xxx
- java 基于tcp客户端服务端发送接收数据
客户端: package demo03; import java.io.IOException; import java.io.InputStream; import java.io.OutputSt ...
- Java Socket 服务端发送数据 客户端接收数据
服务端: package com.thinkgem.wlw.modules.api.test.socket; /** * @Author: zhouhe * @Date: 2019/4/8 9:30 ...
- 【RL-TCPnet网络教程】第14章 RL-TCPnet之TCP客户端
第14章 RL-TCPnet之TCP客户端 本章节为大家讲解RL-TCPnet的TCP客户端实现,学习本章节前,务必要优先学习第12章TCP传输控制协议基础知识.有了这些基础知识之后,再搞本 ...
- 18-ESP8266 SDK开发基础入门篇--TCP 服务器 RTOS版,串口透传,TCP客户端控制LED
https://www.cnblogs.com/yangfengwu/p/11112015.html 先规定一下协议 aa 55 02 01 F1 4C 控制LED点亮 F1 4C为CRC高位和低位 ...
随机推荐
- linux命令(4):mkdir命令
linux mkdir 命令 用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 1.命令格式: mkdir [选项] 目录... 2.命 ...
- linux 程序管理与SElinux
此文涉及的命令:&.jobs.fg.bg.kill.nohup.ps.top.pstree.free.uname.uptime.netstat.dmesg.vmstat.fuser.lsof. ...
- 原生js arguments 用法
http://note.youdao.com/noteshare?id=fcd201e872e1ede16ce0057a1909f613
- js 基本类型与引用类型的区别
1. 基本类型: string,number,boolean,null,undefined 2. 引用类型: Function,Array,Object 访问方式 ...
- bzoj 1051 (强连通) 受欢迎的牛
题目:这里 题意: Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为 ...
- CSS自动换行
style="word-break:break-all;word-wrap:break-word;"
- 记一次PHP7+opcache+zmq出现SIGSEGV 问题的查找(一次不成功的bug查找)
Title: 记一次PHP7+opcache+zmq出现SEGSEGV问题的查找(一次不成功的bug查找) bug来历自述:线上代码PHP环境是5.2,为了提升性能(逼格),于是升级为PHP7并使用 ...
- OOP之C#设计及其UML(反向工程)
现在总结一下C#类关键字(virtual.abstract.override.new.sealed)的使用(以C#代码体现),并再次熟悉一下OOP思想,使用UML工具EA(Enterprise Arc ...
- 【问题解决】线程间操作无效:从不是创建控件“textBox1”的线程访问它
背景 通过一个辅助线程计算出的一个值赋给textBox1.text: 解决办法 1.直接在窗体的构造函数中添加: System.Windows.Forms.Control.CheckForIllega ...
- shell常用命令
wget wget -P /root url -O rename 实现文件下载指定目录和重命名