23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

https://www.cnblogs.com/yangfengwu/p/11203546.html

23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 

先做接收消息

 23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 

 23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 

 

 然后接着

 

23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 

 23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 

 

public class MainActivity extends AppCompatActivity {

    EditText editTextActivityMain1,editTextActivityMain2;//定义两个EditText变量,变量名字我一般设置的和先前页面里面的一样
    Button buttonActivityMain1;//连接按钮

    Socket socket;//定义一个Socket
    MyHandler myHandler;
    private OutputStream outputStream;//TCP发送数据使用
    private InputStream inputStream;//TCP接收数据使用

    byte[] TcpReceiveData = new byte[1024];//用来缓存接收的数据
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myHandler = new MyHandler();
        //获取控件
        editTextActivityMain1 = findViewById(R.id.editTextActivityMain1);
        editTextActivityMain2 = findViewById(R.id.editTextActivityMain2);
        buttonActivityMain1 = findViewById(R.id.buttonActivityMain1);
        buttonActivityMain1.setText("连接");//加上这个,否则按钮需要点击两次才会判断按钮的Text是"连接"

        //连接按钮点击事件
        buttonActivityMain1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (buttonActivityMain1.getText().toString() == "连接"){
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            //这里面写具体的程序
                            try {
                                socket = new Socket(editTextActivityMain1.getText().toString(),Integer.valueOf(editTextActivityMain2.getText().toString()));//连接TCP服务器
                                if (socket.isConnected()){//如果连接上TCP服务器
                                    Log.e("MainActivity", "isConnected");
                                    Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量
                                    msg.what = 1;//设置消息变量的 what 变量值 为1
                                    myHandler.sendMessage(msg);//插入消息队列

                                    outputStream = socket.getOutputStream();//获取输出数据流
                                    inputStream = socket.getInputStream();//获取输入数据流
                                    TcpClientReceive();//加载接收函数
                                }
                            }
                            catch (Exception e){
                                Log.e("MainActivity", e.toString());
                            }
                        }
                    }).start();
                }
                else {
                    try{ socket.close(); }catch (Exception e){} //关闭连接
                    try{ inputStream.close(); }catch (Exception e){} //关闭数据流
                    buttonActivityMain1.setText("连接");//按钮显示连接
                }
            }
        });
    }

    //TCP客户端接收数据
    public void TcpClientReceive(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(socket.isConnected()){//如果客户端一直连接着就一直在任务里面
                    try{
                        int TcpReceiveDataLen = inputStream.read(TcpReceiveData);//接收数据,服务器断开会返回-1

                        if(TcpReceiveDataLen!=-1){
                            byte[] Buffer = new byte[TcpReceiveDataLen];//创建一个新的数组
                            System.arraycopy(TcpReceiveData, 0, Buffer, 0, TcpReceiveDataLen);//拷贝数据
                            Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量
                            msg.what = 2;//设置消息变量
                            msg.obj = Buffer;//obj 可以接收任意类型的变量
                            myHandler.sendMessage(msg);//插入消息队列
                        }
                        else{//断开了连接
                            Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量
                            msg.what = 9;//设置消息变量
                            myHandler.sendMessage(msg);//插入消息队列
                        }
                    }catch (Exception e){//接收数据有错误
                        Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量
                        msg.what = 9;//设置消息变量
                        myHandler.sendMessage(msg);//插入消息队列
                    }
                }
            }
        }).start();
    }



    //Handler
    class MyHandler extends Handler {
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 1){//接收到消息变量的 what 变量值 为1
                buttonActivityMain1.setText("断开");//按钮显示断开
            }
            else if (msg.what == 2){//接收到消息变量的 what 变量值 为2
                try{
                    byte[] TcpReadData = (byte[])msg.obj;//接收消息
                    Log.e("MainActivity", new String(TcpReadData) );//打印消息
                }catch (Exception e){}

            }
            else if (msg.what == 9){//接收到消息变量的 what 变量值 为9
                try{ socket.close(); }catch (Exception e){} //关闭连接
                try{ inputStream.close(); }catch (Exception e){} //关闭连接
                buttonActivityMain1.setText("连接");//按钮显示连接
            }
        }
    }
}

 

测试Android 接收数据

23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 

 测试服务器突然故障

23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 

 23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 

稍等,,我还是直接打印一下日志比较好

23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 ................有BUG

23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 

 加上break;

 

再测试

23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 

 

public class MainActivity extends AppCompatActivity {

    EditText editTextActivityMain1,editTextActivityMain2;//定义两个EditText变量,变量名字我一般设置的和先前页面里面的一样
    Button buttonActivityMain1;//连接按钮

    Socket socket;//定义一个Socket
    MyHandler myHandler;
    private OutputStream outputStream;//TCP发送数据使用
    private InputStream inputStream;//TCP接收数据使用

    byte[] TcpReceiveData = new byte[1024];//用来缓存接收的数据
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myHandler = new MyHandler();
        //获取控件
        editTextActivityMain1 = findViewById(R.id.editTextActivityMain1);
        editTextActivityMain2 = findViewById(R.id.editTextActivityMain2);
        buttonActivityMain1 = findViewById(R.id.buttonActivityMain1);
        buttonActivityMain1.setText("连接");//加上这个,否则按钮需要点击两次才会判断按钮的Text是"连接"

        //连接按钮点击事件
        buttonActivityMain1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (buttonActivityMain1.getText().toString() == "连接"){
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            //这里面写具体的程序
                            try {
                                socket = new Socket(editTextActivityMain1.getText().toString(),Integer.valueOf(editTextActivityMain2.getText().toString()));//连接TCP服务器
                                if (socket.isConnected()){//如果连接上TCP服务器
                                    Log.e("MainActivity", "isConnected");
                                    Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量
                                    msg.what = 1;//设置消息变量的 what 变量值 为1
                                    myHandler.sendMessage(msg);//插入消息队列

                                    outputStream = socket.getOutputStream();//获取输出数据流
                                    inputStream = socket.getInputStream();//获取输入数据流
                                    TcpClientReceive();//加载接收函数
                                }
                            }
                            catch (Exception e){
                                Log.e("MainActivity", e.toString());
                            }
                        }
                    }).start();
                }
                else {
                    try{ socket.close(); }catch (Exception e){} //关闭连接
                    try{ inputStream.close(); }catch (Exception e){} //关闭数据流
                    buttonActivityMain1.setText("连接");//按钮显示连接
                }
            }
        });
    }

    //TCP客户端接收数据
    public void TcpClientReceive(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(socket.isConnected()){//如果客户端一直连接着就一直在任务里面
                    try{
                        int TcpReceiveDataLen = inputStream.read(TcpReceiveData);//接收数据,服务器断开会返回-1

                        if(TcpReceiveDataLen!=-1){
                            byte[] Buffer = new byte[TcpReceiveDataLen];//创建一个新的数组
                            System.arraycopy(TcpReceiveData, 0, Buffer, 0, TcpReceiveDataLen);//拷贝数据
                            Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量
                            msg.what = 2;//设置消息变量
                            msg.obj = Buffer;//obj 可以接收任意类型的变量
                            myHandler.sendMessage(msg);//插入消息队列
                        }
                        else{//断开了连接
                            Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量
                            msg.what = 9;//设置消息变量
                            myHandler.sendMessage(msg);//插入消息队列
                            break;
                        }
                    }catch (Exception e){//接收数据有错误
                        Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量
                        msg.what = 9;//设置消息变量
                        myHandler.sendMessage(msg);//插入消息队列
                        break;
                    }
                }
            }
        }).start();
    }



    //Handler
    class MyHandler extends Handler {
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 1){//接收到消息变量的 what 变量值 为1
                buttonActivityMain1.setText("断开");//按钮显示断开
            }
            else if (msg.what == 2){//接收到消息变量的 what 变量值 为2
                try{
                    byte[] TcpReadData = (byte[])msg.obj;//接收消息
                    Log.e("MainActivity", new String(TcpReadData) );//打印消息
                }catch (Exception e){}

            }
            else if (msg.what == 9){//接收到消息变量的 what 变量值 为9
                try{ socket.close(); }catch (Exception e){} //关闭连接
                try{ inputStream.close(); }catch (Exception e){} //关闭连接
                buttonActivityMain1.setText("连接");//按钮显示连接
                Log.e("MainActivity", "和服务器断开连接!!!" );//打印消息
            }
        }
    }
}

 

现在做一下发送和接收数据的页面

23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 

 点击这个,改为百分比

 23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

拖到50%

23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 

 

23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

我更改了背景色,和显示字体的颜色

23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 

23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 

 

 

 23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 

现在把接收的数据显示出来

 

 23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 

 测试

23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 

 23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

现在做一个显示16进制和字符串切换的

23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

 

 其实咱接收过来的就是16进制,咱需要把16进制转化为16进制字符串

/**
     * 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;    
    }  

 

23-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 加入消息处理

上一篇:iOS 常用算法之设计一个算法,验证某字符是否为合法IPV4字符


下一篇:android 7.0以上charles https抓包