当前位置:   article > 正文

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

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地址

  1. /**
  2. * @Description 获取设备的接入的wifi或流量网络的IP地址。
  3. */
  4. String getIPAddress() {
  5. Context context=MainActivity.this;
  6. NetworkInfo info = ((ConnectivityManager) context
  7. .getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
  8. if (info != null && info.isConnected()) {
  9. //流量网络
  10. if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
  11. try {
  12. for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); )
  13. {
  14. NetworkInterface intf = en.nextElement();
  15. for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); )
  16. {
  17. InetAddress inetAddress = enumIpAddr.nextElement();
  18. if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
  19. return inetAddress.getHostAddress();
  20. }
  21. }
  22. }
  23. } catch (SocketException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. //wifi网络
  28. else if (info.getType() == ConnectivityManager.TYPE_WIFI)
  29. {
  30. WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
  31. WifiInfo wifiInfo = wifiManager.getConnectionInfo();
  32. //调用方法将int转换为地址字符串
  33. String ipAddress = intIP2StringIP(wifiInfo.getIpAddress());//得到IPV4地址
  34. return ipAddress;
  35. }
  36. } else
  37. {
  38. Toast.makeText(this,"请先连接网络", Toast.LENGTH_SHORT).show();
  39. }
  40. return null;
  41. }
  42. /**
  43. * @Description int类型IP转换为String类型
  44. */
  45. String intIP2StringIP(int ip) {
  46. return (ip & 0xFF) + "." +
  47. ((ip >> 8) & 0xFF) + "." +
  48. ((ip >> 16) & 0xFF) + "." +
  49. (ip >> 24 & 0xFF);
  50. }

二、创建TCP服务器

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

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

  1. /**
  2. * 创建子线程等待客户端接入
  3. */
  4. class NewThread_wait_tcpclient extends Thread {
  5. OutputStream os;
  6. @Override
  7. public void run() {
  8. while (true) {
  9. System.out.println("–等待客户端连接–");
  10. try {
  11. tcp_client_socket = serverSocket.accept();
  12. System.out.println("得到客户端连接:" + socket);
  13. os = tcp_client_socket.getOutputStream();
  14. String client_ip=tcp_client_socket.getInetAddress().toString();
  15. new Thread(){
  16. @Override
  17. public void run() {
  18. handler.post(new Runnable() {
  19. @Override
  20. public void run() {
  21. connected=true;
  22. //完成客户端连接成功后的一些UI控件更新等
  23. }
  24. });
  25. }
  26. }.start();
  27. String text = "Hello, I am TCP Server";
  28. os.write(text.getBytes());
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. Receive_Thread receive_Thread = new Receive_Thread();
  33. receive_Thread.start();
  34. }
  35. }
  36. }

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

  1. class Receive_Thread extends Thread {
  2. public void run()
  3. {
  4. if (null != tcp_client_socket) {
  5. try {
  6. while (true) {
  7. final byte[] buffer = new byte[1024];
  8. tcp_inputStream = tcp_client_socket.getInputStream();
  9. final int len = tcp_inputStream.read(buffer);
  10. if (len == -1) {
  11. tcp_client_socket.close();
  12. tcp_client_socket = null;
  13. connected = false;
  14. runOnUiThread(new Runnable()
  15. {
  16. public void run() {
  17. //完成断开连接后的一些UI控件更新
  18. }
  19. });
  20. return;
  21. }
  22. runOnUiThread(new Runnable()
  23. {
  24. public void run() {
  25. // TODO Auto-generated method stub
  26. String recv_data=new String(buffer, 0, len);
  27. //textView_tip.setText("接收到:"+recv_data);
  28. //SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
  29. //Date time_date = new Date(System.currentTimeMillis());
  30. //add_display_recvdata("["+simpleDateFormat.format(time_date)+"]:"+recv_data);
  31. }
  32. });
  33. }
  34. } catch (IOException e) {
  35. // TODO Auto-generated catch block
  36. e.printStackTrace();
  37. }
  38. }
  39. }
  40. }

四、向客户端发送数据

  1. new Thread(new Runnable() {
  2. OutputStream os = null;
  3. @Override
  4. public void run() {
  5. try {
  6. os = tcp_client_socket.getOutputStream();
  7. //从输入框中获取输入的数据
  8. String text=String.valueOf(editText_senddata.getText());
  9. if(!(text.isEmpty()))
  10. {
  11. try {
  12. os.write(text.getBytes());
  13. Looper.prepare();//解除Android不允许在子线程中弹出 Toast 提示的限制
  14. Toast.makeText(getApplicationContext(), "已发送", Toast.LENGTH_SHORT).show();
  15. Looper.loop(); //恢复限制
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. else
  21. {
  22. Looper.prepare();//解除Android不允许在子线程中弹出 Toast 提示的限制
  23. Toast.makeText(getApplicationContext(), "请先输入要发送的数据", Toast.LENGTH_SHORT).show();
  24. Looper.loop();//恢复限制
  25. }
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. }).start();

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


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


其他参考链接:

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/583658
推荐阅读
相关标签
  

闽ICP备14008679号