android TCP 客户端(仅接收数据)

配合log4net使用,用来接收调试信息。因此,此客户端只管通过TCP接收字符串数据,然后显示在界面上。

接收TCP数据

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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操作。

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

// 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功能,接收线程来干。

主线程中的处理消息

?





1

2

3

4

5

6

Handler handler = new
Handler(){

    @Override

    public
void handleMessage(Message msg){

        text.setText(text.getText().toString()+(String)msg.obj);

    }

};

接收线程中的发布消息

?





1

2

3

Message msg = new
Message();

msg.obj = msgstring;

(MainActivity.this).handler.postMessage();

以上就构成了一个简单,但可用的TCP方式的log接收端。拿个360wifi或者小米wifi,就可以使用手机接收pc应用程序发出来的log了。

很久没有登陆自己的账号了,还好自己的账号还在,庆幸之余,发一篇今天的随笔,感谢园子一直保留着这份记忆。

时间: 2024-11-08 12:20:08

android TCP 客户端(仅接收数据)的相关文章

ESP8266 SDK开发: 综合篇-8266TCP服务器与Android TCP客户端实现无线网络通信控制

实现的功能 Android TCP客户端连接8266的TCP服务器,网络控制开发板继电器 1.控制继电器吸合 2.控制继电器断开 前言 1.用户在看这一节之前请先学习 https://www.cnblogs.com/yangfengwu/p/12543923.html   Android TCP客户端 https://www.cnblogs.com/yangfengwu/p/12543847.html   8266 TCP服务器 2.控制继电器引脚 协议规定 Android TCP客户端发送给E

Android Socket 发送与接收数据问题: 发送后的数据接收到总是粘包

先说明一下粘包的概念: 发送时是两个单独的包.两次发送,但接收时两个包连在一起被一次接收到.在以前 WinCE 下 Socket 编程,确实也要处理粘包的问题,没想到在 Android 下也遇到了.首先想从发送端能否避免这样的问题,例如: (1) 调用强制刷数据完成发送的函数:(2) 设置发送超时.1 先试了调用 flush() 函数,但运行后现象依旧2 设置发送超时是 Windows 平台的做法,但在 Android 平台下是否有类似的设置呢?查看 Socket 类的实现代码:java.net

?TCP发送与接收数据

//客户端 package liu.net.tcp; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class Client { /* tcp 客户端建立的步骤 * 1.建立tcp客户端服务 * 1.1 因为是面向连接的,必须有连接才可以进行通信 * 1.2在建立客户端时,必须明确目的地地址和

android wifi连接可接收数据, gprs不能

android获取网络上的文件的时候,在WiFi环境下可以获得,GPRS网络不行. 原因:访问的时候要使用静态ip,不能动态ip. 例子: 华为网盘直链云加速里面存储的文件,下载的时候ip是动态分配的,GPRS网络环境下不能获取数据. 扩展: 1. 动态ip与静态ip的区别 动态IP就是由网络供应商提供,每次使用都是随机获取的!也就是说你上次上网的IP的地址和这次的不一定相同!静态IP就是需要你在本地连接里设置好唯一专署的IP地址,每次使用都不再变化! 2. 为什么GPRS网络下,获取数据的时候

单线程下TCP客户端循环发送数据给服务器

效果: 1 import socket 2 3 4 def main(): 5 while True: 6 # 1.创建tcp套接字 7 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 8 9 # 2.连接服务器 10 tcp_socket.connect(('192.168.2.100', 7788)) 11 12 # 3.发送数据 13 send_data = input("请输入要发送的数据:") 14

Android编程:双工tcp客户端中应用RxJava

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN10 开发环境:Android Studio 2.2 Preview 3 RxJava版本:2.0.1 RxAndroid版本:2.0.1 说明: 在<Android编程:双工tcp客户端>文中用双线程处理了tcp客户端的发送和接收.现在用RxJava对此客户端代码进行优化: 用RxJava创建连接,替代之前的创建连接线程 用RxJava断开连接,替代之前的断开连接线程 用RxJ

android 之TCP客户端编程

吸取教训!!!本来花了5个小时写完了,没想到,,,因为没点上面的自动保存查看一下,全没了,重新写呗 关于网络通信:每一台电脑都有自己的ip地址,每台电脑上的网络应用程序都有自己的通信端口,张三的电脑(ip:192.168.1.110)上有一个网络应用程序A(通信端口5000),李四的电脑(ip:192.168.1.220)上有一个网络应用程序B(通信端口8000),张三给李四发消息,首先你要知道李四的ip地址,向指定的ip(李四ip:192.168.1.220)发信息,信息就发到了李四的电脑.再

android蓝牙(二)——接收数据

在蓝牙开发中,我们有这样的一个需求:我们的android客户端要始终保持和蓝牙的连接,当蓝牙有数据返回的时候,android客户端就要及时的收取数据,当蓝牙没有数据返回的时候我们就要保持android客户端和蓝牙之间的连接.这个时候我们就要采取socket来实现和蓝牙之间的连接.做项目使用过http轮询去获取数据,但是发现那样总是有一定的弊端.于是就才用了socket方式去获取数据. 实现步骤:1.启动一个service去监听是否有数据返回.一旦有数据返回就启动一个线程去处理数据 2.处理完数据

Android对UDP组播接收数据的有限支持(一)

最近,想做一个跨平台的局域网的文件传输软件,思路是组播设备信息,TCP连接传输文件.于是进行了一次简单的UDP组播测试,发现Android对于UDP组播接收数据的支持即极为有限. 部分代码如下 1 package com.hsocket.Udp; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 7 public class UdpReceiv