前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 开发: 通信篇-TCP客户端

Android 开发: 通信篇-TCP客户端

作者头像
杨奉武
发布2020-03-23 11:47:31
2.9K0
发布2020-03-23 11:47:31
举报
文章被收录于专栏:知识分享

说明

这节教给大家用Android写一个TCP客户端程序

官方文档

https://www.android-doc.com/reference/java/net/Socket.html

页面

编写连接程序

1.获取控件

代码语言:javascript
复制
    EditText editTextIPAddress,editTextPort;//输入IP地址,端口号
    Button buttonConnect;//连接按钮

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        buttonConnect = findViewById(R.id.buttonConnect);
        editTextIPAddress = findViewById(R.id.editTextIPAddress);
        editTextPort = findViewById(R.id.editTextPort);


    }

2.添加网络权限

代码语言:javascript
复制
<uses-permission android:name="android.permission.INTERNET" />

3.定义一个socket

代码语言:javascript
复制
Socket socket;

4.编写按钮点击连接/断开程序

代码语言:javascript
复制
MyHandler myHandler;//使用Handler更新控件

myHandler = new MyHandler();
代码语言:javascript
复制
        buttonConnect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (buttonConnect.getText()=="连接"){
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量
                            try{
                                socket = new Socket(editTextIPAddress.getText().toString(),Integer.valueOf(editTextPort.getText().toString()));
                                if(socket.isConnected()){
                                    msg.what = 1;//设置消息变量的 what 变量值 为1
                                }
                            }catch (Exception e){
                                msg.what = 0;//设置消息变量的 what 变量值 为0
                            }
                            myHandler.sendMessage(msg);//插入消息队列
                        }
                    }).start();
                }
                else{
                    try{ socket.close(); }catch (Exception e){} //关闭连接
                    buttonConnect.setText("连接");//按钮显示连接
                }
            }
        });
代码语言:javascript
复制
//Handler
    class MyHandler extends Handler {
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case 0:
                    Toast.makeText(MainActivity.this,"连接出错",Toast.LENGTH_SHORT).show();
                    break;
                case 1:
                    buttonConnect.setText("断开");//按钮显示断开
                    break;
                default: break;
            }
        }
    }

提示:获取IP地址和端口号,执行连接

代码语言:javascript
复制
socket = new Socket(editTextIPAddress.getText().toString(),Integer.valueOf(editTextPort.getText().toString()));

当前程序

代码语言:javascript
复制
    EditText editTextIPAddress,editTextPort;//输入IP地址,端口号
    Button buttonConnect;//连接按钮
    Socket socket;

    MyHandler myHandler;//使用Handler更新控件
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myHandler = new MyHandler();
        buttonConnect = findViewById(R.id.buttonConnect);
        buttonConnect.setText("连接");
        editTextIPAddress = findViewById(R.id.editTextIPAddress);
        editTextPort = findViewById(R.id.editTextPort);

        buttonConnect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (buttonConnect.getText()=="连接"){
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量
                            try{
                                socket = new Socket(editTextIPAddress.getText().toString(),Integer.valueOf(editTextPort.getText().toString()));
                                if(socket.isConnected()){
                                    msg.what = 1;//设置消息变量的 what 变量值 为1
                                }
                            }catch (Exception e){
                                msg.what = 0;//设置消息变量的 what 变量值 为0
                            }
                            myHandler.sendMessage(msg);//插入消息队列
                        }
                    }).start();
                }
                else{
                    try{ socket.close(); }catch (Exception e){} //关闭连接
                    buttonConnect.setText("连接");//按钮显示连接
                }
            }
        });
    }

    //Handler
    class MyHandler extends Handler {
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case 0:
                    Toast.makeText(MainActivity.this,"连接出错",Toast.LENGTH_SHORT).show();
                    break;
                case 1:
                    buttonConnect.setText("断开");//按钮显示断开
                    break;
                default: break;
            }
        }
    }

接收数据

1.定义 InputStream 用于获取数据输入流,定义一个数组用于缓存数据

代码语言:javascript
复制
    InputStream inputStream;//获取输入流
    byte[] RevBuff = new byte[1460];//缓存数据

2.定义一个函数,里面放一个任务,用于不停的接收数据

代码语言:javascript
复制
public void Recv(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (socket!= null && socket.isConnected()){
                    try{
                        int Len = inputStream.read(RevBuff);//获取数据
                        if(Len!=-1){
                            Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量
                            msg.what = 3;//设置消息变量的 what 变量值 为3
                            msg.arg1 = Len;//接收的数据个数
                            msg.obj = RevBuff;//传递数据
                            myHandler.sendMessage(msg);//插入消息队列
                        }
                        else{//连接异常断开
                            Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量
                            msg.what = 0;//设置消息变量的 what 变量值 为0
                            myHandler.sendMessage(msg);//插入消息队列
                            break;
                        }
                    }catch (Exception e){//连接异常断开
                        Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量
                        msg.what = 0;//设置消息变量的 what 变量值 为0
                        myHandler.sendMessage(msg);//插入消息队列
                        break;
                    }
                }
            }
        }).start();
    }

3.调用接收函数

4.在Handle中处理数据,把数据显示在页面

4.1.获取控件

4.2.把接收的消息追加到Textview显示

测试

1.电脑端开启TCP服务器

2.保证手机和电脑在一个局域网内

查看自己的电脑IP

3.手机连接

接收显示16进制数据

1.关于16进制显示和前面的串口上位机显示16进制数据是一样的道理

https://cloud.tencent.com/developer/article/1593405

2.JAVA和C#提供的函数不一样,java的转换程序如下:

代码语言:javascript
复制
    /**
     * 16进制byte转16进制String--用空格隔开
     * @param bytes
     * @return
     */
    public static String byteToHexStr(byte[] bytes)
    {    
        String str_msg = "";
        for (int i = 0; i < bytes.length; i++){    
            str_msg = str_msg + String.format("%02X",bytes[i])+" ";
        }    
        return str_msg;    
    }  

3.获取16进制选择控件

4.编写处理函数

测试

清除接收

发送数据

1.获取控件,定义输出流变量

2.获取输出流

3.点击发送按钮发送发送文本框里面的数据

4.测试

发送16进制数据

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
  • 页面
  • 编写连接程序
  • 接收数据
  • 测试
  • 接收显示16进制数据
  • 测试
  • 清除接收
  • 发送数据
  • 发送16进制数据
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档