Android studio TCP网络调试助手应用开发(支持TCP Server与Client切换)

        在前几篇的文章中带大家完成了基于TCP的物联网安卓应用开发,教程内容是创建了一个TCP客户端并连接服务器完成数据通信的过程,后不久又发布了一个ESP8266创建TCP 服务器与安卓的客户端进行通信的一个文章,当时在文章中提到“如果大家有需要将ESP8266配置为TCP的客户端,手机APP作为服务器端,可以进入公众号进行私信,有需求的话会再更新一期”。
    近期平台就收到好几位小伙伴的私信,今天就带大家完成一个安卓创建TCP 服务器并与客户端通信的功能,最终的APP集成了客户端模式和服务器模式的切换,形成一个简易的TCP调试助手APP,文末免费下载Android Studio工程。
    APP功能展示视频:

TCPassistant


一、获取手机接入网络的IP地址

创建服务器与创建客户端不同,创建客户端的IP地址不可随意设置,只能采用设备本机的IP地址,首先先获取本机IP地址:

 /**
     * @Description 获取设备的接入的wifi或流量网络的IP地址。
     */
String getIPAddress() {
        Context context=MainActivity.this;
        NetworkInfo info = ((ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
        if (info != null && info.isConnected()) {
            //流量网络
            if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
                try {
                    for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); )
                    {
                        NetworkInterface intf = en.nextElement();
                        for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); )
                        {
                            InetAddress inetAddress = enumIpAddr.nextElement();
                            if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
                                return inetAddress.getHostAddress();
                            }
                        }
                    }
                } catch (SocketException e) {
                    e.printStackTrace();
                }
            }
            //wifi网络
            else if (info.getType() == ConnectivityManager.TYPE_WIFI)
            {
                WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
                WifiInfo wifiInfo = wifiManager.getConnectionInfo();
                //调用方法将int转换为地址字符串
                String ipAddress = intIP2StringIP(wifiInfo.getIpAddress());//得到IPV4地址
                return ipAddress;
            }
        } else 
        {
             Toast.makeText(this,"请先连接网络", Toast.LENGTH_SHORT).show();
        }
        return null;
    }
    /**
     * @Description int类型IP转换为String类型
     */
    String intIP2StringIP(int ip) {
        return (ip & 0xFF) + "." +
                ((ip >> 8) & 0xFF) + "." +
                ((ip >> 16) & 0xFF) + "." +
                (ip >> 24 & 0xFF);
    }

二、创建TCP服务器

String port="";  //可以通过edit_textview.getText().toString();获取输入框的IP
ServerSocket serverSocket;
serverSocket = new ServerSocket(Integer.parseInt(port));

三、创建子线程等待客户端接入

/**
     * 创建子线程等待客户端接入
     */
    class NewThread_wait_tcpclient extends Thread {
        OutputStream os;
        @Override
        public void run() {
            while (true) {
                System.out.println("–等待客户端连接–");
                try {
                    tcp_client_socket = serverSocket.accept();
                    System.out.println("得到客户端连接:" + socket);
                    os = tcp_client_socket.getOutputStream();
                    String client_ip=tcp_client_socket.getInetAddress().toString();
                    new Thread(){
                        @Override
                        public void run() {
                            handler.post(new Runnable() {
                                @Override
                                public void run() {
                                    connected=true;
                                    //完成客户端连接成功后的一些UI控件更新等
                                }
                            });
                        }
                    }.start();
                    String text = "Hello, I am TCP Server";
                    os.write(text.getBytes());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Receive_Thread receive_Thread = new Receive_Thread();
                receive_Thread.start();
            }
        }
    }

三、创建子线程接收客户端数据并处理

class Receive_Thread extends Thread {
public void run()
{
            if (null != tcp_client_socket) {
                try {
                    while (true) {
                        final byte[] buffer = new byte[1024];
                        tcp_inputStream = tcp_client_socket.getInputStream();
                        final int len = tcp_inputStream.read(buffer);
                        if (len == -1) {
                            tcp_client_socket.close();
                            tcp_client_socket = null;
                            connected = false;
                            runOnUiThread(new Runnable()
                            {
                                public void run() {
                                  //完成断开连接后的一些UI控件更新
                                }
                            });
                            return;
                        }
                        runOnUiThread(new Runnable()
                        {
                            public void run() {
                                // TODO Auto-generated method stub
                                String recv_data=new String(buffer, 0, len);
                                //textView_tip.setText("接收到:"+recv_data);
                                //SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
                                //Date time_date = new Date(System.currentTimeMillis());
                                //add_display_recvdata("["+simpleDateFormat.format(time_date)+"]:"+recv_data);
                            }
                        });
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

四、向客户端发送数据

new Thread(new Runnable() {
    OutputStream os = null;
    @Override
    public void run() {
        try {
            os = tcp_client_socket.getOutputStream();
            //从输入框中获取输入的数据
            String text=String.valueOf(editText_senddata.getText());
            if(!(text.isEmpty()))
            {
                try {
                    os.write(text.getBytes());
                    Looper.prepare();//解除Android不允许在子线程中弹出 Toast 提示的限制
                    Toast.makeText(getApplicationContext(), "已发送", Toast.LENGTH_SHORT).show();
                    Looper.loop(); //恢复限制

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            else
            {
                Looper.prepare();//解除Android不允许在子线程中弹出 Toast 提示的限制
                Toast.makeText(getApplicationContext(), "请先输入要发送的数据", Toast.LENGTH_SHORT).show();
                Looper.loop();//恢复限制
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    }).start();

通过上述部分程序可以完成TCP Server的创建和TCP客户端的通信,结合之前发布的TCP Client部分的文章就可以完成TCP网络调试助手的APP应用开发。

扫描二维码关注公众号,回复: 15258707 查看本文章

公众号“IOT趣制作”回复关键字“tcpass”或“0532”即可获取Android studio的工程文件。


其他参考链接:

TCP安卓应用开发基础教程(TCP Client-Android Studio开发)

ESP8266的TCP通信基础教程(结合手机APP)

猜你喜欢

转载自blog.csdn.net/weixin_43351158/article/details/129748322