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

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();

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值